㈠ 程序员必备知识(操作系统5-文件系统)
本篇与之前的第三篇的内存管理知识点有相似的地方
对于运行的进程来说,内存就像一个纸箱子, 仅仅是一个暂存数据的地方, 而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在 外部存储 中。就像图书馆这种地方,不仅空间大,而且能够永久保存。
我们最常用的外部存储就是 硬盘 ,数据是以文件的形式保存在硬盘上的。为了管理这些文件,我们在规划文件系统的时候,需要考虑到以下几点。
第一点,文件系统要有严格的组织形式,使得文件能够 以块为单位进行存储 。这就像图书馆里,我们会给设置一排排书架,然后再把书架分成一个个小格子,有的项目存放的资料非常多,一个格子放不下,就需要多个格子来进行存放。我们把这个区域称为存放原始资料的 仓库区 。
第二点,文件系统中也要有 索引区 ,用来方便查找一个文件分成的多个块都存放在了什么位置。这就好比,图书馆的书太多了,为了方便查找,我们需要专门设置一排书架,这里面会写清楚整个档案库有哪些资料,资料在哪个架子的哪个格子上。这样找资料的时候就不用跑遍整个档案库,在这个书架上找到后,直奔目标书架就可以了。
第三点,如果文件系统中有的文件是热点文件,近期经常被读取和写入,文件系统应该有 缓存层 。这就相当于图书馆里面的热门图书区,这里面的书都是畅销书或者是常常被借还的图书。因为借还的次数比较多,那就没必要每次有人还了之后,还放回遥远的货架,我们可以专门开辟一个区域, 放置这些借还频次高的图书。这样借还的效率就会提高。
第四点,文件应该用 文件夹 的形式组织起来,方便管理和查询。这就像在图书馆里面,你可以给这些资料分门别类,比如分成计算机类.文学类.历史类等等。这样你也容易管理,项目组借阅的时候只要在某个类别中去找就可以了。
在文件系统中,每个文件都有一个名字,这样我们访问一个文件,希望通过它的名字就可以找到。文件名就是一个普通的文本。 当然文件名会经常冲突,不同用户取相同的名字的情况还是会经常出现的。
要想把很多的文件有序地组织起来,我们就需要把它们成为 目录 或者文件夹。这样,一个文件夹里可以包含文件夹,也可以包含文件,这样就形成了一种 树形结构 。而我们可以将不同的用户放在不同的用户目录下,就可以一定程度上避免了命名的冲突问题。
第五点,Linux 内核要在自己的内存里面维护一套数据结构,来保存哪些文件被哪些进程打开和使用 。这就好比,图书馆里会有个图书管理系统,记录哪些书被借阅了,被谁借阅了,借阅了多久,什么时候归还。
文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。
文件系统的基本数据单位是 文件 ,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。
Linux最经典的一句话是:“一切皆文件”,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。
Linux文件系统会为每个文件分配两个数据结构: 索引节点(index node) 和 目录项(directory entry) ,它们主要用来记录文件的元信息和目录层次结构。
●索引节点,也就是inode, 用来记录文件的元信息,比如inode编号、文件大小访问权限、创建时间、修改时间、 数据在磁盘的位置 等等。 索引节点是文件的唯一标识 ,它们之间一一对应, 也同样都会被 存储在硬盘 中,所以索引节点同样占用磁盘空间。
●目录项,也就是dentry, 用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成 目录结构 ,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是 缓存在内存 。
由于索引节点唯一标识一个文件,而目录项记录着文件的名,所以目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别字。比如,硬链接的实现就是多个目录项中的索引节点指向同一个文件。
注意,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件在磁盘里面保存子目录或文件。
(PS:目录项和目录不是一个东西!你也不是一个东西(^_=), 虽然名字很相近,但目录是个文件。持久化存储在磁盘,而目录项是内核一个数据结构,缓存在内存。
如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了 文件系统的效率。
目录项这个数据结构不只是表示目录,也是可以表示文件的。)
磁盘读写的最小单位是 扇区 ,扇区的大小只有512B大小,很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。
所以,文件系统把多个扇区组成了一个 逻辑块 ,每次读写的最小单位就是逻辑块(数据块) , Linux中的逻辑块大小为4KB,也就是一次性读写 8个扇区,这将大大提高了磁盘的读写的效率。
以上就是索引节点、目录项以及文件数据的关系,下面这个图就很好的展示了它们之间的关系:
索引节点是存储在硬盘上的数据,那么为了加速文件的访问,通常会把索引节点加载到内存中。
另外,磁盘进行格式化的时候,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。
●超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。
●索引节点区,用来存储索引节点;
●数据块区,用来存储文件或目录数据;
我们不可能把超级块和索引节点区全部加载到内存,这样内存肯定撑不住,所以只有当需要使用的时候,才将其加载进内存,它们加载进内存的时机是不同的.
●超级块:当文件系统挂载时进入内存;
●索引节点区:当文件被访问时进入内存;
文件系统的种类众多,而操作系统希望 对用户提供一个统一的接口 ,于是在用户层与文件系统层引入了中间层,这个中间层就称为 虚拟文件系统(Virtual File System, VFS) 。
VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的统一接口即可。
在Linux文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系如下图:
Linux支持的文件系统也不少,根据存储位置的不同,可以把文件系统分为三类:
●磁盘的文件系统,它是直接把数据存储在磁盘中,比如Ext 2/3/4. XFS 等都是这类文件系统。
●内存的文件系统,这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的/proc 和/sys文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。
●网络的文件系统,用来访问其他计算机主机数据的文件系统,比如NFS. SMB等等。
文件系统首先要先挂载到某个目录才可以正常使用,比如Linux系统在启动时,会把文件系统挂载到根目录。
在操作系统的辅助之下,磁盘中的数据在计算机中都会呈现为易读的形式,并且我们不需要关心数据到底是如何存放在磁盘中,存放在磁盘的哪个地方等等问题,这些全部都是由操作系统完成的。
那么,文件数据在磁盘中究竟是怎么样的呢?我们来一探究竟!
磁盘中的存储单元会被划分为一个个的“ 块 ”,也被称为 扇区 ,扇区的大小一般都为512byte.这说明即使一块数据不足512byte,那么它也要占用512byte的磁盘空间。
而几乎所有的文件系统都会把文件分割成固定大小的块来存储,通常一个块的大小为4K。如果磁盘中的扇区为512byte,而文件系统的块大小为4K,那么文件系统的存储单元就为8个扇区。这也是前面提到的一个问题,文件大小和占用空间之间有什么区别?文件大小是文件实际的大小,而占用空间则是因为即使它的实际大小没有达到那么大,但是这部分空间实际也被占用,其他文件数据无法使用这部分的空间。所以我们 写入1byte的数据到文本中,但是它占用的空间也会是4K。
这里要注意在Windows下的NTFS文件系统中,如果一开始文件数据小于 1K,那么则不会分配磁盘块来存储,而是存在一个文件表中。但是一旦文件数据大于1K,那么不管以后文件的大小,都会分配以4K为单位的磁盘空间来存储。
与内存管理一样,为了方便对磁盘的管理,文件的逻辑地址也被分为一个个的文件块。于是文件的逻辑地址就是(逻辑块号,块内地址)。用户通过逻辑地址来操作文件,操作系统负责完成逻辑地址与物理地址的映射。
不同的文件系统为文件分配磁盘空间会有不同的方式,这些方式各自都有优缺点。
连续分配要求每个文件在磁盘上有一组连续的块,该分配方式较为简单。
通过上图可以看到,文件的逻辑块号的顺序是与物理块号相同的,这样就可以实现随机存取了,只要知道了第一个逻辑块的物理地址, 那么就可以快速访问到其他逻辑块的物理地址。那么操作系统如何完成逻辑块与物理块之间的映射呢?实际上,文件都是存放在目录下的,而目录是一种有结构文件, 所以在文件目录的记录中会存放目录下所有文件的信息,每一个文件或者目录都是一个记录。 而这些信息就包括文件的起始块号和占有块号的数量。
那么操作系统如何完成逻辑块与物理块之间的映射呢? (逻辑块号, 块内地址) -> (物理块号, 块内地址),只需要知道逻辑块号对应的物理块号即可,块内地址不变。
用户访问一个文件的内容,操作系统通过文件的标识符找到目录项FCB, 物理块号=起始块号+逻辑块号。 当然,还需要检查逻辑块号是否合法,是否超过长度等。因为可以根据逻辑块号直接算出物理块号,所以连续分配支持 顺序访问和随机访问 。
因为读/写文件是需要移动磁头的,如果访问两个相隔很远的磁盘块,移动磁头的时间就会变长。使用连续分配来作为文件的分配方式,会使文件的磁盘块相邻,所以文件的读/写速度最快。
连续空间存放的方式虽然读写效率高,但是有 磁盘空间碎片 和 文件长度不易扩展 的缺陷。
如下图,如果文件B被删除,磁盘上就留下一块空缺,这时,如果新来的文件小于其中的一个空缺,我们就可以将其放在相应空缺里。但如果该文件的大小大于所
有的空缺,但却小于空缺大小之和,则虽然磁盘上有足够的空缺,但该文件还是不能存放。当然了,我们可以通过将现有文件进行挪动来腾出空间以容纳新的文件,但是这个在磁盘挪动文件是非常耗时,所以这种方式不太现实。
另外一个缺陷是文件长度扩展不方便,例如上图中的文件A要想扩大一下,需要更多的磁盘空间,唯一的办法就只能是挪动的方式,前面也说了,这种方式效率是非常低的。
那么有没有更好的方式来解决上面的问题呢?答案当然有,既然连续空间存放的方式不太行,那么我们就改变存放的方式,使用非连续空间存放方式来解决这些缺陷。
非连续空间存放方式分为 链表方式 和 索引方式 。
链式分配采取离散分配的方式,可以为文件分配离散的磁盘块。它有两种分配方式:显示链接和隐式链接。
隐式链接是只目录项中只会记录文件所占磁盘块中的第一块的地址和最后一块磁盘块的地址, 然后通过在每一个磁盘块中存放一个指向下一 磁盘块的指针, 从而可以根据指针找到下一块磁盘块。如果需要分配新的磁盘块,则使用最后一块磁盘块中的指针指向新的磁盘块,然后修改新的磁盘块为最后的磁盘块。
我们来思考一个问题, 采用隐式链接如何将实现逻辑块号转换为物理块号呢?
用户给出需要访问的逻辑块号i,操作系统需要找到所需访问文件的目录项FCB.从目录项中可以知道文件的起始块号,然后将逻辑块号0的数据读入内存,由此知道1号逻辑块的物理块号,然后再读入1号逻辑块的数据进内存,此次类推,最终可以找到用户所需访问的逻辑块号i。访问逻辑块号i,总共需要i+ 1次磁盘1/0操作。
得出结论: 隐式链接分配只能顺序访问,不支持随机访问,查找效率低 。
我们来思考另外一个问题,采用隐式链接是否方便文件拓展?
我们知道目录项中存有结束块号的物理地址,所以我们如果要拓展文件,只需要将新分配的磁盘块挂载到结束块号的后面即可,修改结束块号的指针指向新分配的磁盘块,然后修改目录项。
得出结论: 隐式链接分配很方便文件拓展。所有空闲磁盘块都可以被利用到,无碎片问题,存储利用率高。
显示链接是把用于链接各个物理块的指针显式地存放在一张表中,该表称为文件分配表(FAT, File Allocation Table)。
由于查找记录的过程是在内存中进行的,因而不仅显着地 提高了检索速度 ,而且 大大减少了访问磁盘的次数 。但也正是整个表都存放在内存中的关系,它的主要的缺点是 不适 用于大磁盘 。
比如,对于200GB的磁盘和1KB大小的块,这张表需要有2亿项,每一项对应于这2亿个磁盘块中的一个块,每项如果需要4个字节,那这张表要占用800MB内存,很显然FAT方案对于大磁盘而言不太合适。
一直都在,加油!(*゜Д゜)σ凸←自爆按钮
链表的方式解决了连续分配的磁盘碎片和文件动态打展的问题,但是不能有效支持直接访问(FAT除外) ,索引的方式可以解决这个问题。
索引的实现是为每个文件创建一个 索引数据块 ,里面存放的 是指向文件数据块的指针列表 ,说白了就像书的目录一样,要找哪个章节的内容,看目录查就可以。
另外, 文件头需要包含指向索引数据块的指针 ,这样就可以通过文件头知道索引数据块的位置,再通过索弓|数据块里的索引信息找到对应的数据块。
创建文件时,索引块的所有指针都设为空。当首次写入第i块时,先从空闲空间中取得一个块, 再将其地址写到索引块的第i个条目。
索引的方式优点在于:
●文件的创建、增大、缩小很方便;
●不会有碎片的问题;
●支持顺序读写和随机读写;
由于索引数据也是存放在磁盘块的,如果文件很小,明明只需一块就可以存放的下,但还是需要额外分配一块来存放索引数据,所以缺陷之一就是存储索引带来的开销。
如果文件很大,大到一个索引数据块放不下索引信息,这时又要如何处理大文件的存放呢?我们可以通过组合的方式,来处理大文件的存储。
先来看看 链表+索引 的组合,这种组合称为 链式索引块 ,它的实现方式是在 索引数据块留出一个存放下一个索引数据块的指针 ,于是当一个索引数据块的索引信息用完了,就可以通过指针的方式,找到下一个索引数据块的信息。那这种方式也会出现前面提到的链表方式的问题,万一某个指针损坏了,后面的数据也就会无法读取了。
还有另外一种组合方式是 索引+索引 的方式,这种组合称为多级索引块,实现方式是通过一个索引块来存放多个索引数据块,一层套一层索引, 像极了俄罗斯套娃是吧๑乛◡乛๑
前面说到的文件的存储是针对已经被占用的数据块组织和管理,接下来的问题是,如果我要保存一个数据块, 我应该放在硬盘上的哪个位置呢?难道需要将所有的块扫描一遍,找个空的地方随便放吗?
那这种方式效率就太低了,所以针对磁盘的空闲空间也是要引入管理的机制,接下来介绍几种常见的方法:
●空闲表法
●空闲链表法
●位图法
空闲表法
空闲表法就是为所有空闲空间建立一张表,表内容包括空闲区的第一个块号和该空闲区的块个数,注意,这个方式是连续分配的。如下图:
当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。当用户撤销一个文件时,系统回收文件空间。这时,也需顺序扫描空闲表,寻找一个空闲表条目并将释放空间的第一个物理块号及它占用的块数填到这个条目中。
这种方法仅当有少量的空闲区时才有较好的效果。因为,如果存储空间中有着大量的小的空闲区,则空闲表变得很大,这样查询效率会很低。另外,这种分配技术适用于建立连续文件。
空闲链表法
我们也可以使用链表的方式来管理空闲空间,每一个空闲块里有一个指针指向下一个空闲块,这样也能很方便的找到空闲块并管理起来。如下图:
当创建文件需要一块或几块时,就从链头上依次取下一块或几块。反之,当回收空间时,把这些空闲块依次接到链头上。
这种技术只要在主存中保存一个指针, 令它指向第一个空闲块。其特点是简单,但不能随机访问,工作效率低,因为每当在链上增加或移动空闲块时需要做很多1/0操作,同时数据块的指针消耗了一定的存储空间。
空闲表法和空闲链表法都不适合用于大型文件系统,因为这会使空闲表或空闲链表太大。
位图法
位图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。
当值为0时,表示对应的盘块空闲,值为1时,表示对应的盘块已分配。它形式如下:
在Linux文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于inode空闲块的管理,因为inode也是存储在磁盘的,自然也要有对其管理。
前面提到Linux是用位图的方式管理空闲空间,用户在创建一个新文件时, Linux 内核会通过inode的位图找到空闲可用的inode,并进行分配。要存储数据时,会通过块的位图找到空闲的块,并分配,但仔细计算一下还是有问题的。
数据块的位图是放在磁盘块里的,假设是放在一个块里,一个块4K,每位表示一个数据块,共可以表示4 * 1024 * 8 = 2^15个空闲块,由于1个数据块是4K大小,那么最大可以表示的空间为2^15 * 4 * 1024 = 2^27个byte,也就是128M。
也就是说按照上面的结构,如果采用(一个块的位图+ 一系列的块),外加一(个块的inode的位图+一系列的inode)的结构能表示的最大空间也就128M,
这太少了,现在很多文件都比这个大。
在Linux文件系统,把这个结构称为一个 块组 ,那么有N多的块组,就能够表示N大的文件。
最终,整个文件系统格式就是下面这个样子。
最前面的第一个块是引导块,在系统启动时用于启用引导,接着后面就是一个一个连续的块组了,块组的内容如下:
● 超级块 ,包含的是文件系统的重要信息,比如inode总个数、块总个数、每个块组的inode个数、每个块组的块个数等等。
● 块组描述符 ,包含文件系统中各个块组的状态,比如块组中空闲块和inode的数目等,每个块组都包含了文件系统中“所有块组的组描述符信息”。
● 数据位图和inode位图 ,用于表示对应的数据块或inode是空闲的,还是被使用中。
● inode 列表 ,包含了块组中所有的inode, inode 用于保存文件系统中与各个文件和目录相关的所有元数据。
● 数据块 ,包含文件的有用数据。
你可以会发现每个块组里有很多重复的信息,比如 超级块和块组描述符表,这两个都是全局信息,而且非常的重要 ,这么做是有两个原因:
●如果系统崩溃破坏了超级块或块组描述符,有关文件系统结构和内容的所有信息都会丢失。如果有冗余的副本,该信息是可能恢复的。
●通过使文件和管理数据尽可能接近,减少了磁头寻道和旋转,这可以提高文件系统的性能。
不过,Ext2 的后续版本采用了稀疏技术。该做法是,超级块和块组描述符表不再存储到文件系统的每个块组中,而是只写入到块组0、块组1和其他ID可以表示为3、5、7的幂的块组中。
在前面,我们知道了一个普通文件是如何存储的,但还有一个特殊的文件,经常用到的目录,它是如何保存的呢?
基于Linux 一切切皆文件的设计思想,目录其实也是个文件,你甚至可以通过vim打开它,它也有inode, inode 里面也是指向一些块。
和普通文件不同的是, 普通文件的块里面保存的是文件数据,而目录文件的块里面保存的是目录里面一项一项的文件信息 。
在目录文件的块中,最简单的保存格式就是 列表 ,就是一项一项地将目录下的文件信息(如文件名、文件inode.文件类型等)列在表里。
列表中每一项就代表该目录下的文件的文件名和对应的inode,通过这个inode,就可以找到真正的文件。
通常,第一项是“则”,表示当前目录,第二项是.,表示上一级目录, 接下来就是一项一项的文件名和inode。
如果一个目录有超级多的文件,我们要想在这个目录下找文件,按照列表一项一项的找,效率就不高了。
于是,保存目录的格式改成 哈希表 ,对文件名进行哈希计算,把哈希值保存起来,如果我们要查找一个目录下面的文件名,可以通过名称取哈希。如果哈希能够匹配上,就说明这个文件的信息在相应的块里面。
Linux系统的ext文件系统就是采用了哈希表,来保存目录的内容,这种方法的优点是查找非常迅速,插入和删除也较简单,不过需要一些预备措施来避免哈希冲突。
目录查询是通过在磁盘上反复搜索完成,需要不断地进行/0操作,开销较大。所以,为了减少/0操作,把当前使用的文件目录缓存在内存,以后要使用该文件时只要在内存中操作,从而降低了磁盘操作次数,提高了文件系统的访问速度。
感谢您的阅读,希望您能摄取到知识!加油!冲冲冲!(发现光,追随光,成为光,散发光!)我是程序员耶耶!有缘再见。<-biubiu-⊂(`ω´∩)
㈡ 程序员应该怎么学习
1、选定方向
编程的世界是多元纷繁的,大的方向就分前端开发、后端开发、移动开发、云计算、数据处理、智能硬件、物联网、虚拟现实等等,光编程语言都几十种。如果没有做过功课,贸然进入只会分分钟懵逼。所以最好是根据自己的兴趣爱好再结合市场前景,先选定一个方向,再选择一门语言,然后头也不回的深深扎进去。
2、优化学习方式
做好笔记,记录经验,我们大多数人并没有过目不忘的神技,很多时候我们学了也不一定马上掌握,需要过后花时间慢慢领悟,而且还有忘掉的风险,所以对于重要的知识点都要做好笔记。
3、多看官方文档,外文资料
互联网是一个更新迭代很快的行业,所有编程语言都会不断的更新新功能和修复旧Bug,网上查的资料很有可能是旧的解决方案,现在已经不适用了。所以最好最快的方法就是查看官方文档。
4、动手做项目
我们学习编程的最终目的就是用所学的做出具有一定功能的项目,而做项目又是最好的学习和巩固知识的方式。如果前期能力不足就先做一些简单的功能模块,一步一步慢慢来,不要一开始就要实现各种酷炫炸天功能,遇到不会的就在网上查, 现在互联网这么发达,获取资源也及其方便。
自学过程中的一些注意事项
1、要善于构建大的知识框架体系,不要执着于细枝末节的知识点。中国的应试教育培养出来的人都喜欢啃细节,对于自学来讲这是大忌,比如在遇到一个函数的时候,非要把这个函数的参数,返回值都弄得清清楚楚才肯罢休。
2、先学重要的知识点,用不到的可以暂时放一放,因为你时间有限,遇到比较难的知识点,如果不是特别重要的,就跳过去,当你哪天用到的时候再来好好的研究,带着问题去学习,你会发现学习难的知识点也没有那么痛苦。
3、要善于查资料,互联网就是最好的老师,遇到问题先网上查,至少能够解决你98%的问题,因为你遇到的问题别人肯定也会遇到,除非你已经到了高处不胜寒的境界。
㈢ 作为程序员的你,常用的软件有哪些
这个就非常多了,下面我以常见的编程开发软件和数据库管理软件为例,简单介绍几种,感兴趣的朋友可以尝试一下:
01 编程开发软件这个要看具体编程语言了,不同语言开发工具自然不同,这里以常见的C/C++、Java和Python为例,简单介绍3种比较常用的软件:
这是Windows平台下一个非常专业的集成开发工具,号称宇宙第一IDE环境,不仅仅只是C/C++,常见的C#、VB等编程语言,这个软件都能很好支持,智能补全、代码高亮、语法检查等功能非常不错,除此之外,还支持单元测试、代码重构和分析等高级功能,因此非常适合大型项目开发和维护:
这是一个非常专业智能的Java开发工具,在企业和个人桌面中,有着非常高的使用率和欢迎度,自动补全、语法提示、代码高亮等功能非常不错,除此之外,还支持JUnit、CVS整合、代码重构等高级功能,自带有Maven和Gradle构建工具,因此更适合Java项目开发和维护,个人使用起来非常不错:
这是一个非常专业的Python开发软件,和IntelliJ IDEA一样,Jetbrains公司的产品,在业界非常流行、受欢迎,智能补全、代码高亮、语法提示等功能非常不错,除此之外,还支持代码重构和分析、单元测试等高级功能,因此更适合大型项目,个人使用来说,也非常简单,很容易上手和掌握:
02 数据库管理软件
这个就非常多了,不同数据库都有专门的管理软件和工具,这里简单介绍3个比较通用的数据库管理软件,分别是HeidiSQL、DBeaver和DataGrip,对于日常使用来说,非常不错:
这是Windows平台下一个非常轻巧灵活的数据库管理软件,基于Delphi开发而来,目前支持MySQL、MariaDB、MSSQL、PostgreSQL等主流数据库,常见的建库建表、视图索引、触发器等基本功能,这个软件都能很好兼容,除此之外,还支持SQL脚本导入导出、数据备份恢复等功能,对于日常数据库管理来说,非常不错:
这是一个基于Java开发的数据库管理软件,免费、开源、跨平台,目前支持Oracle、MySQL、PostgreSQL、SQL Server等十几种主流数据库开发,建库建表、视图索引、触发器、存储过程等基本功能 都 可轻松查看和设计,数据库导入导出、数据 恢复 备份等功能也都非常不错,对于日常数据库管理和维护来说,是一个非常不错的工具:
这也是一个通用的数据库管理软件,Jetbrains公司的产品,支持跨平台,但原则上针对个人不免费,常见的PostgreSQL、MySQL、Oracle等数据库,这个软件都能很好支持, 数据导入导出( 恢复备份 )、 智能代码填充、版本 集成 控制等功能非常不错,对于日常数据库管理来说,也是一个不错的工具:
每天常用开发工具:
0.Git:分布式版本控制系统;
1.IntelliJ IDEA:java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一;
2.Sublime Text:不只是代码编辑器;
3.Postman:Http请求模拟工具和功能强大的网页调试工具;
4.DataGrip:支持几乎所有主流的关系数据库、多功能的数据库操作工具;
5.Vagrant:用于创建和部署虚拟化开发环境,配合虚拟机使用;
6.Gradle:自动化构建工具;
7.JIRA:项目与事务跟踪工具;
8.iTerm2:Mac上的终端工具;
9.Jenkins:持续集成工具。
做了一个写代码用了十几年的人,很多编程的习惯已经养成了,现在就罗列下每天必用的软件:
直接安装的linux系统,因为几乎所有的代码都是在linux下完成
不同的开发语言,每天要用到的软件可能不一样。
我是开发java web的,电脑安装了很多工具,但是说每天要用到的好像就几个。
作为程序员使用最多的软件,莫过于编程开发所用到的软件编辑器,但是编辑器的种类有很多。我们需要做到的是,找到你最喜欢的编辑器然后熟练的使用它。
同时掌握常见的一些快捷键的操作方式,从而来提升我们的工作效率,而不是以软件而论软件,什么都去接触使用。毕竟软件是工具是帮助我们提升开发效率。
下面我就列举我们PHP经常使用的软件
IDE工具类软件这一类是开发软件编写代码用的。这一类的软件非常多,我就推荐一个经常使用的PHPStorm,因为太多的话大家也用不到,也没有那么多的精力去熟练每一个编辑器。
PHPStorm是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。可以说是PHP开发程序员必备的神器。
常用快捷键如下:
1.复制快捷方式
F5 复制文件/文件夹
CTRL+C 复制
CTRL+V 粘贴
CTRL+X 剪 切,删除行
CTRL+D 复制行
CTRL+SHIFT+V 可以复制多个文本
2.自动代码
ALT+回车 导入包,自动修正
CTRL+ALT+L 格式化代
码CTRL+ALT+I 自动缩进
CTRL+ALT+O 优化导入的类和包
CTRL+SHIFT+SPACE 切换窗口
CTRL+SPACE空格 代码自动完成,代码提示,一般与输入法冲突
CTRL+ALT+SPACE 类 名或接口名提示(与系统冲突)
CTRL+P 方法参数提示,显示默认参数
CTRL+J 自动代码提示,自动补全
CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里ALT+INSERT 生成代码(如GET,SET方法,构造函数等)
3.运行
Alt + Shift + F10 选择的配置和运行
Alt + Shift + F9 选择配置和调试
Shift + F10 运行
Shift + F9调试
Ctrl + Shift + F10运行范围内配置编辑器
Ctrl + Shift + X运行命令行
4.其他快捷方式
CTRL+Z 倒退(代码后悔)
CTRL+SHIFT+Z 向前
CTRL+H 显 示类结构图
Ctrl +F12 文件结构弹出
CTRL+O 魔术方法
CTRL+/ 注释//取消注释
CTRL+SHIFT+/ 注释/*...*/
ctrl + '.': 折叠选中的代码的代码
ALT+ / 切换代码视图,标签切换
5.其他快捷方式
CTRL+Z 倒退(代码后悔)
CTRL+SHIFT+Z 向前
CTRL+H 显 示类结构图
Ctrl +F12 文件结构弹出
CTRL+O 魔术方法CTRL+/ 注释//取消注释
CTRL+SHIFT+/ 注释/*...*/
ctrl + '.': 折叠选中的代码的代码
ALT+ / 切换代码视图,
数据库相关常用的工具 Navicat for MySQL是管理数据库的操作工具,都是可以连接远程的云数据库。方便简化开发,还可以手动备份、可视化的sql分析。
常用快捷键:
ctrl+q 打开查询窗口
ctrl+/ 注释sql语句
ctrl+shift +/ 解除注释
ctrl+r 运行查询窗口的sql语句
ctrl+shift+r 只运行选中的sql语句
F6 打开一个mysql命令行窗口
ctrl+d (1):查看表结构详情,包括索引 触发器,存储过程,外键,唯一键;(2):复制一行
ctrl+l 删除一行
ctrl+n 打开一个新的查询窗口
ctrl+w 关闭一个查询窗口
ctrl+tab 多窗口切换
服务器连接软件XShell6是非常强大的SSH远程终端客户端,帮助我们连接远程的Linux服务器来进行操作。
粘贴:Shift+Insert
历史 命令编辑ctrl + p 返回上一次输入命令字符
alt + > 返回上一次执行命令
其它
ctrl + s 锁住终端
ctrl + q 解锁终端
ctrl + l 清屏相当于命令clear
Tab键,快速补全命令
轻量级文本编辑器Notepad++。这个很轻量,打开一下文本非常的方便。
常用快捷键
Ctrl+C 复制
Ctrl+X 剪切
Ctrl+V 粘贴
Ctrl+Z 撤消
Ctrl+Y 恢复
Ctrl+A 全选
Ctrl+F 键查找对话框启动
Ctrl+H 查找/替换对话框
Ctrl+D 复制并粘贴当行
Ctrl+F2 切换书签
F2 转到下一个书签Shift+F2 转到上一个书签
F11 全屏模式
前端 :
visual studio code
后端:
pycharm
IDEA
安卓:
android studio
浏览器:
谷歌
火狐
数据库管理:
navicat
远端链接:
fileZilla
xshell
electerm(mac上使用)
流程图设计:
xmind
processOn
笔记:
为知笔记(付费一年60)
有道云笔记
虚拟机(容器)
VMware Fusion(mac上)
docker
其他:
postman
jmeter
作为一个12年开发经验的前端程序员,我来聊聊每天必用的几个软件。
写代码自然离不开 编辑器 。目前我主要使用的是微软的 Visual Studio Code 。VS Code比较轻量,功能足够应付日常开发所需,跨平台,而且完全免费 。因为之前长期使用Visual Studio在Windows平台上做开发,后来技术栈变化,经常需要在Linux和MacOS上做开发,VS Code就成了我顺理成章的选择。后来干脆在Windows上也用VS Code了。目前整个团队都已经被VS Code圈粉了。其它类似的如Sublime Text(需要付费)和Atom也有不少人使用。
因为是团队开发, 源代码管理工具 自然必不可少,而 git 是目前最热门的一个。我们公司也不例外,几年前从Perforce迁移到了 GitHub企业版 (和公众版本UI完全相同)。平时的代码审查也都是在GitHub企业版上完成的,不再使用单独的代码审查工具。有些不习惯使用命令行方式的同事使用 SourceTree 完成日常的代码分支管理和提交,而我则比较热衷于命令行方式。VS Code也提供了比较完善的git集成,但因为习惯的原因,除了直观比较不同代码版本的差异,我一般也不用VS Code执行git操作。
作为一个Web前端, 浏览器及前端调试工具 自然不可或缺, Google Chrome + Developer Tools (F12) 自然是首选。使用Developer Tools,可以对JavaScript进行调试,监控HTTP请求/响应,分析CSS计算问题和JS性能问题。 Chrome下还有很多功能强大的插件,个人比较常用的包括React Developer Tools、PostMan、Proxy SwitchOmega和AdBlock。当然,因为经常面对浏览器兼容性问题,Firefox、IE、Edge、Apple Safari以及各自的Developer Tools都是免不了要用的。
团队目前使用Scrum模型,自然需要一个做 任务规划和质量管理 的工具。我们采用了 JIRA , 每天的站会(daily stanp meeting)都会对scrum看板(board)进行更新。
遇到技术问题,自然免不了要上网查找资料。 Google 的使用频率非常高(需要科学上网)。大部分问题都能在 StackOveflow 上找到线索,但有时候也不得不跑到大名鼎鼎的同性交友网站 GitHub 上看源码。 MDN (Mozilla Developer Network)对于前端开发也是不可或缺(此处鄙视一下w3cschool,上面到处是错误知识)。
其它如node.js/npm、docker等,因为和具体的技术栈相关,就不具体展开讲了。
作为一个开发人员,你每天使用什么软件呢,欢迎说说看。
尽管我是后端出身的,不过也经常写前端代码,甚至还用C#/C++参与过一些客户端开发,自认为也算是一个Web全栈工程师。随着前端技术的不断进步,现在的前端已经不再是写写页面这么简单了,很多逻辑在前端就写了,我建议每一个出色的开发者应该尽可能对前后端都能有不错的掌握。
今天给大家推荐一些我认为前端和后端开发都需要经常用到的一些软件,这里面包括了查询资料工具、原型工具、文本编辑器、版本管理工具。
原型工具 不管前端还是后端,尤其是前端程序员,在跟产品经历沟通之后肯定会要查看原型的,方便自己在开发过程中使用,基本上大公司输出的原型都比较规范,除非你遇到张小龙这种级别的大神,哥们儿直接盯着你做了。
目前主流的原型工具主要有Axure、MockPlus、墨刀等,其中Axure依然是应用最为广泛的原型工具,大多数开发者也都应该用来看原型。
文本编辑器 不管是前端还是后端程序员,当然前端程序员就不说了,在WebStorm出现之前,没有一款真正可以叫做IDE的前端开发工具,那么基本上文本编辑器就是前端程序员最重要的编程工具。同样后端程序员即使不需要写前端代码,文本编辑器也是必备的,您不需要每次看代码都打开庞大的集成开发环境,像IDEA这种比较耗费资源的,平时查看代码啥的完全没有必要,何况你还经常要看一些前端代码。
当然你比较习惯Linux/Unix下开发,Emacs/Vim可能是你用得比较多的文本编辑器,还有UltraEdit、Sublime Text、EditPlus、Atom这些老牌的文本编辑器,不过现在我觉得每个程序员都应该下载一个Visual Studio Code,支持的语言比较多,而且插件非常丰富,是微软官方支持的开发者工具,开源免费而且颜值非常高。
查询资料、版本管理工具不用多说,每个程序员都要学会很好的使用Google、Stack Overflow两个工具,可以说你日常开发当中可能遇到的问题,通过这两个工具你全都能找到解决方案。
另外一个是Dash文档管理工具,Dash是一个非常好的开发者帮助文档工具,这个工具的好处是给所有的开发文档做了一个整合,C/C++、Java、PHP、Python、Latex、Emacs Lisp、Haskell、JavaScript、Go语言等文档都能够在这个工具当中下载使用。
最后一个就是版本管理了,SVN和Git依然是目前使用最为广泛的版本管理工具,不过就使用来说我还是推荐Git版本控制系统,可以说这个时代Git就是最好的版本管理工具了,尤其是开源时代、互联网时代,Git已经成为了最重要的版本管理工具,不管是命令行管理还是使用Github等客户端工具,堪称完美。
入行十一年,现在主要做一些管理和架构方面的工作,也会做一些Coding,主要是一些新技术的研究和“踩坑”。
编辑器首先是EditPlus,这是一个文本编辑器。最常用的两个功能:正则表达式查询和文件夹内所有文件内容搜索。
平时经常需要看一些系统日志,甚至要从好几天几十个日志文件中找到内容,这个软件很好用。(原谅我们没有上日志平台)
然后就是IDE啦,我还是喜欢用Eclipse,有时候会用STS(Spring Tool Suite),它也是一个被包装过的Eclipse,方便做一些Spring框架的研究。
一个是DbVisualizer,凡是具有JDBC数据库接口的数据库都可以管理,什么数据库都能连。
还有一个是SQLyog,这是一个快速而简洁的图形化管理MYSQL数据库的工具,我只用里面一个功能,就是数据的导入导出,效率非常高!
大部分项目只对外提供接口服务,所以接口测试工具少不了,我一般使用SoapUI,WebService/Rest都可以进行测试。
每天肯定会用的肯定不止上面几个,还有版本控制工具svn和git,都会用到是因为单位svn现在开始往git迁移。
因为用的Scrum敏捷开发流程,所以JIRA、Sonar、Fisheye这些也是都会用到的。
Maven也不用说了,几个项目基本都是基于Maven构建的。
必用的基本就是这些,只要电脑开着,这几个软件基本都是打开状态。