现在要上大一新生大学规划范文 主要想学编程、价钱在4k~6k 希望能玩mincraft光影和主流游戏 求推荐

1. 现在 Linux 内核是4级页表结构,3级页表的时代是10年前了。 X86_64 架构下,无论 Intel 还是 AMD 的 CPU, 都是四级的硬件页表,所以软件层面的页表至少要4级(否则,进程访问的空间将受限, 因为有一级页表被固定住了,所以3级页表时代,X86_64 只能访问 512GB 空间, 而 X86_64 的设计可访问空间达到 131 072( = 2^47) GB。打个比方就是,省,市,区,县 四级行政规划,硬要嵌套进三级规划,只能表达市,区,县三级,省一级给固定住了, 访问范围缩小了)。 &br&&br&2. 不过你会问:i386 只有三级硬件页表:PUD -& PMD -& PTE, 怎么嵌入四级软件页表结构? 答案就是虚设一层。打个比方:北京是省级行政单位,如果要按省,市,区,县结构来表达某县,就是: 北京(省)北京(市)XX区XX县, 有一层完全就是占个位而已。有兴趣了解 Linux 页表的变迁历史,可以看我之前写过的文章:&a href=&//link.zhihu.com/?target=http%3A//larmbr.com//the-evolution-of-4-level-page-talbe-in-linux/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linux内核4级页表的演进&/a&&br&&br&3. 内核空间,用户空间的地址都是虚拟地址,都要经过 MMU 的翻译,变成物理地址。用户空间的虚拟地址,就是按前面所述的走四级页表来翻译。 内核空间虚拟地址是所有进程共享的,重要的是,从效率角度看, 如果同样走四级页表翻译的流程,速度太慢;于是,内核在初始化时,就创建内核空间的映射(因为所有进程共享,有一份就够了),并且,采用的就是线性映射,而不是走页表翻译这种类似哈希表的方式。这样,内核地址的翻译,简化为一条偏移加减指令就行,相比走页表,效率大大提高(不过,内核空间并非完全不用页表,此处讲原理所以简化,详细的看尾注).&br&&br&4. 至于为什么用户空间不能也像内核空间这么做,原因是用户地址空间是随进程创建才产生的,它的页面可能散布在不同的物理内存中,无法这么做。另外,走页表的过程,不止是翻译的过程,还是一个权限检查的过程,对于不可控的用户态地址,这安全性检查必不可省。而内核空间,只有一份,所有可以提前固定下来一片连续的物理地址空间,按线性方法来映射。这是很正常的优化方法。&br&&br&5. 那么问题来了,在 Linux 刚引入的时候, i386 4G 的进程空间典型的是 3G user + 1G kernel 的划分,这教科书上都有说。 那按前面的线性方法, 1G 内核空间,只能映射 1G 物理地址空间,这对内核来说,太掣肘了。所以,折衷方案是, Linux 内核只对 1G 内核空间的前 896 MB 按前面所说的方法线性映射, 剩下的 128 MB 的内核空间, 采用动态映射[1]的方式,即按需映射的方式 ,这样,内核态的访问空间更多了。 这个直接映射的部分, 就是题主所说的 NORMAL 区, 就是所谓低端内存。到了 64 位时代, 内核空间大大增大, 这种限制就没了,内核空间可以完全进行线性映射,不过,基于[1]的缘故, 仍保留有动态映射这部分。&br&&br&&br&[1] 动态映射不全是为了内核空间可以访问更多的物理内存,还有一个重要原因: 当内核需要连续多页面的空间时,如果内核空间全线性映射,那么,可能会出现内核空间碎片化而满足不了这么多连续页面分配的需求。基于此,内核空间也必须有一部分是非线性映射,从而在这碎片化物理地址空间上,用页表构造连续虚拟地址空间,这就是所谓vmalloc空间。
1. 现在 Linux 内核是4级页表结构,3级页表的时代是10年前了。 X86_64 架构下,无论 Intel 还是 AMD 的 CPU, 都是四级的硬件页表,所以软件层面的页表至少要4级(否则,进程访问的空间将受限, 因为有一级页表被固定住了,所以3级页表时代,X86_64 只能访问 …
&figure&&img src=&https://pic3.zhimg.com/v2-c670e54b8afbd56ce770c3_b.jpg& data-rawwidth=&480& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&https://pic3.zhimg.com/v2-c670e54b8afbd56ce770c3_r.jpg&&&/figure&&p&本着两条原则推荐一波机器学习,深度学习的课程以及常用的库:&/p&&p&1.不建议报辅导班。不是因为我们不应该为学习知识付费, 而是因为有更好的资源,而这些资源恰好免费。报辅导班学习浪费钱倒是次要的,主要是时间有限,所以我们要把最好的时间集中在最高效的事情上。&/p&&p&2.视频资源种类繁多,但我只选最有价值的。&/p&&p&Are you ready?&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bb9edb159d17bf7a0016f4_b.jpg& data-rawwidth=&700& data-rawheight=&700& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-bb9edb159d17bf7a0016f4_r.jpg&&&/figure&&br&&p&以下课程均有中文字幕:&/p&&p&1.机器学习&/p&&p&机器学习视频我推荐大神Andrew Ng的课程:&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.coursera.org/learn/machine-learning/home/welcome& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&coursera.org/learn/mach&/span&&span class=&invisible&&ine-learning/home/welcome&/span&&span class=&ellipsis&&&/span&&/a&&br&&/p&&p&Andrew Ng的课程有两个版本,一个是斯坦福大学的公开课,一个是coursera上的课程。我更建议后者。首先是在couresa上讲,Andrew Ng面对的是所有在线的听众,这样自己听课就会有一种带入感,仿佛就在课堂一样,而听斯坦福大学公开课的那个版本自己听起来更像一个旁听生。其次是在couresa上作业,课件齐全,不用再到其他的地方找,减少很多麻烦。&/p&&p&2.深度学习&/p&&p&深度学习我推荐李飞飞团队主讲的《深度学习与计算机视觉》:&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//study.163.com/course/courseMain.htm%3FcourseId%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&斯坦福CS231n-深度学习与计算机视觉 - 网易云课堂&/a&&br&&/p&&p&课件下载:&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//github.com/amazingzby/cs231n& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&amazingzby/cs231n&/a&&br&&/p&&p&剧透一丢丢:第一节李飞飞讲课时怀着孩子,所以只能坐着讲课,但课程内容依然interesting 。&/p&&p&3.推荐个与机器学习,深度学习不相关的课程,Jerry Cain讲的《编程范式》,我只听过前几节,感觉超级赞,就推荐给大家了&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//open.163.com/special/opencourse/paradigms.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&斯坦福大学公开课:编程范式_全27集_网易公开课&/a&&br&&/p&&p&OK!第一波已经结束,来第二波&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-70c92cd288b857a135c493a0c9cd5880_b.jpg& data-rawwidth=&278& data-rawheight=&156& class=&content_image& width=&278&&&/figure&介绍几款常用的python库:&/p&&p&1.numpy&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.numpy.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NumPy - NumPy&/a&&br&&/p&&p&处理数组,矩阵非常有效的库,不会numpy,学后面的白搭。&/p&&p&2.matplotlib&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//matplotlib.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&python plotting - Matplotlib 1.5.3 documentation&/a&&br&&/p&&p&数据可视化(其实就是画图,直方图,折线图,饼状图等等)必备。&/p&&p&3.pandas&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//pandas.pydata.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python Data Analysis Library&/a&&br&&/p&&p&pandas主要用于清洗数据,如果输入数据不那么规范(比如有数据丢失或有无效数字),用pandas处理会非常方便。&/p&&p&4.sklearn&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//scikit-learn.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&scikit-learn.org/&/span&&span class=&invisible&&&/span&&/a&&br&&/p&&p&机器学习必备&/p&&p&5.tensorflow&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.tensorflow.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&tensorflow.org/&/span&&span class=&invisible&&&/span&&/a&&br&&/p&&p&这个不解释,老司机都懂的!&/p&&p&今天就先到这里,下车前记得刷卡~&/p&
本着两条原则推荐一波机器学习,深度学习的课程以及常用的库:1.不建议报辅导班。不是因为我们不应该为学习知识付费, 而是因为有更好的资源,而这些资源恰好免费。报辅导班学习浪费钱倒是次要的,主要是时间有限,所以我们要把最好的时间集中在最高效的事…
&figure&&img src=&https://pic1.zhimg.com/v2-c_b.jpg& data-rawwidth=&4841& data-rawheight=&3232& class=&origin_image zh-lightbox-thumb& width=&4841& data-original=&https://pic1.zhimg.com/v2-c_r.jpg&&&/figure&&p&分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大。这篇文章中,重点会讨论下分布式数据系统的设计,比如分布式存储系统,分布式搜索系统,分布式分析系统等。&/p&&p&我们先来简单看下Elasticsearch的架构。&/p&&h2&&b&Elasticsearch 集群架构 &/b&&/h2&&p&Elasticsearch是一个非常著名的开源搜索和分析系统,目前被广泛应用于互联网多种领域中,尤其是以下三个领域特别突出。一是搜索领域,相对于solr,真正的后起之秀,成为很多搜索系统的不二之选。二是Json文档数据库,相对于MongoDB,&a href=&http://link.zhihu.com/?target=http%3A//blog.quarkslab.com/mongodb-vs-elasticsearch-the-quest-of-the-holy-performances.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&读写性能更佳&/a&,而且支持更丰富的地理位置查询以及数字、文本的混合查询等。三是时序数据分析处理,目前是日志处理、监控数据的存储、分析和可视化方面做得非常好,可以说是该领域的引领者了。&/p&&p&Elasticsearch的详细介绍可以到&a href=&http://link.zhihu.com/?target=https%3A//www.elastic.co/products/elasticsearch& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&官网&/a&查看。我们先来看一下Elasticsearch中几个关键概念:&/p&&ul&&li&节点(Node):物理概念,一个运行的Elasticearch实例,一般是一台机器上的一个进程。&/li&&li&索引(Index),逻辑概念,包括配置信息mapping和倒排正排数据文件,一个索引的数据文件可能会分布于一台机器,也有可能分布于多台机器。索引的另外一层意思是倒排索引文件。&/li&&li&分片(Shard):为了支持更大量的数据,索引一般会按某个维度分成多个部分,每个部分就是一个分片,分片被节点(Node)管理。一个节点(Node)一般会管理多个分片,这些分片可能是属于同一份索引,也有可能属于不同索引,但是为了可靠性和可用性,同一个索引的分片尽量会分布在不同节点(Node)上。分片有两种,主分片和副本分片。&/li&&li&副本(Replica):同一个分片(Shard)的备份数据,一个分片可能会有0个或多个副本,这些副本中的数据保证强一致或最终一致。&/li&&/ul&&p&用图形表示出来可能是这样子的:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d1fc360ab9c125a365be9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&518& data-rawheight=&264& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&https://pic2.zhimg.com/v2-d1fc360ab9c125a365be9_r.jpg&&&/figure&&ul&&li&Index 1:蓝色部分,有3个shard,分别是P1,P2,P3,位于3个不同的Node中,这里没有Replica。&/li&&li&Index 2:绿色部分,有2个shard,分别是P1,P2,位于2个不同的Node中。并且每个shard有一个replica,分别是R1和R2。基于系统可用性的考虑,同一个shard的primary和replica不能位于同一个Node中。这里Shard1的P1和R1分别位于Node3和Node2中,如果某一刻Node2发生宕机,服务基本不会受影响,因为还有一个P1和R2都还是可用的。因为是主备架构,当主分片发生故障时,需要切换,这时候需要选举一个副本作为新主,这里除了会耗费一点点时间外,也会有丢失数据的风险。&/li&&/ul&&p&&b&Index流程&/b&&/p&&p&建索引(Index)的时候,一个Doc先是经过路由规则定位到主Shard,发送这个doc到主Shard上建索引,成功后再发送这个Doc到这个Shard的副本上建索引,等副本上建索引成功后才返回成功。&/p&&p&在这种架构中,索引数据全部位于Shard中,主Shard和副本Shard各存储一份。当某个副本Shard或者主Shard丢失(比如机器宕机,网络中断等)时,需要将丢失的Shard在其他Node中恢复回来,这时候就需要从其他副本(Replica)全量拷贝这个Shard的所有数据到新Node上构造新Shard。这个拷贝过程需要一段时间,这段时间内只能由剩余主副本来承载流量,在恢复完成之前,整个系统会处于一个比较危险的状态,直到failover结束。&/p&&p&这里就体现了副本(Replica)存在的一个理由,避免数据丢失,提高数据可靠性。副本(Replica)存在的另一个理由是读请求量很大的时候,一个Node无法承载所有流量,这个时候就需要一个副本来分流查询压力,目的就是扩展查询能力。&/p&&p&&b&角色部署方式&/b&&/p&&p&接下来再看看角色分工的两种不同方式:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1854bff71760dae82945_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&692& data-rawheight=&446& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&https://pic2.zhimg.com/v2-1854bff71760dae82945_r.jpg&&&/figure&&p&Elasticsearch支持上述两种方式:&/p&&ul&&li&混合部署(左图):&/li&&li&默认方式。&/li&&li&不考虑MasterNode的情况下,还有两种Node,Data Node和Transport Node,这种部署模式下,这两种不同类型Node角色都位于同一个Node中,相当于一个Node具备两种功能:Data和Transport。&/li&&li&当有index或者query请求的时候,请求随机(自定义)发送给任何一个Node,这台Node中会持有一个全局的路由表,通过路由表选择合适的Node,将请求发送给这些Node,然后等所有请求都返回后,合并结果,然后返回给用户。一个Node分饰两种角色。&/li&&li&好处就是使用极其简单,易上手,对推广系统有很大价值。最简单的场景下只需要启动一个Node,就能完成所有的功能。&/li&&li&缺点就是多种类型的请求会相互影响,在大集群如果某一个Data Node出现热点,那么就会影响途经这个Data Node的所有其他跨Node请求。如果发生故障,故障影响面会变大很多。&/li&&li&Elasticsearch中每个Node都需要和其余的每一个Node都保持13个连接。这种情况下,每个Node都需要和其他所有Node保持连接,而一个系统的连接数是有上限的,这样连接数就会限制集群规模。&/li&&li&还有就是不能支持集群的热更新。&/li&&li&分层部署(右图):&/li&&li&通过配置可以隔离开Node。&/li&&li&设置部分Node为Transport Node,专门用来做请求转发和结果合并。&/li&&li&其他Node可以设置为DataNode,专门用来处理数据。&/li&&li&缺点是上手复杂,需要提前设置好Transport的数量,且数量和Data Node、流量等相关,否则要么资源闲置,要么机器被打爆。&/li&&li&好处就是角色相互独立,不会相互影响,一般Transport Node的流量是平均分配的,很少出现单台机器的CPU或流量被打满的情况,而DataNode由于处理数据,很容易出现单机资源被占满,比如CPU,网络,磁盘等。独立开后,DataNode如果出了故障只是影响单节点的数据处理,不会影响其他节点的请求,影响限制在最小的范围内。&/li&&li&角色独立后,只需要Transport Node连接所有的DataNode,而DataNode则不需要和其他DataNode有连接。一个集群中DataNode的数量远大于Transport Node,这样集群的规模可以更大。另外,还可以通过分组,使Transport Node只连接固定分组的DataNode,这样Elasticsearch的连接数问题就彻底解决了。&/li&&li&可以支持热更新:先一台一台的升级DataNode,升级完成后再升级Transport Node,整个过程中,可以做到让用户无感知。&/li&&/ul&&p&上面介绍了Elasticsearch的部署层架构,不同的部署方式适合不同场景,需要根据自己的需求选择适合的方式。&/p&&h2&&b&Elasticsearch 数据层架构&/b&&/h2&&p&接下来我们看看当前Elasticsearch的数据层架构。&/p&&p&&b&数据存储&/b&&/p&&p&Elasticsearch的Index和meta,目前支持存储在本地文件系统中,同时支持niofs,mmap,simplefs,smb等不同加载方式,性能最好的是直接将索引LOCK进内存的MMap方式。默认,Elasticsearch会自动选择加载方式,另外可以自己在配置文件中配置。这里有几个细节,具体可以看官方文档。&/p&&p&索引和meta数据都存在本地,会带来一个问题:当某一台机器宕机或者磁盘损坏的时候,数据就丢失了。为了解决这个问题,可以使用Replica(副本)功能。&/p&&p&&b&副本(Replica)&/b&&/p&&p&可以为每一个Index设置一个配置项:副本(Replicda)数,如果设置副本数为2,那么就会有3个Shard,其中一个是PrimaryShard,其余两个是ReplicaShard,这三个Shard会被Master尽量调度到不同机器,甚至机架上,这三个Shard中的数据一样,提供同样的服务能力。&/p&&p&副本(Replica)的目的有三个:&/p&&ul&&li&保证服务可用性:当设置了多个Replica的时候,如果某一个Replica不可用的时候,那么请求流量可以继续发往其他Replica,服务可以很快恢复开始服务。&/li&&li&保证数据可靠性:如果只有一个Primary,没有Replica,那么当Primary的机器磁盘损坏的时候,那么这个Node中所有Shard的数据会丢失,只能reindex了。&/li&&li&提供更大的查询能力:当Shard提供的查询能力无法满足业务需求的时候, 可以继续加N个Replica,这样查询能力就能提高N倍,轻松增加系统的并发度。&/li&&/ul&&p&&b&问题&/b&&/p&&p&上面说了一些优势,这种架构同样在一些场景下会有些问题。&/p&&p&Elasticsearch采用的是基于本地文件系统,使用Replica保证数据可靠性的技术架构,这种架构一定程度上可以满足大部分需求和场景,但是也存在一些遗憾:&/p&&ul&&li&Replica带来成本浪费。为了保证数据可靠性,必须使用Replica,但是当一个Shard就能满足处理能力的时候,另一个Shard的计算能力就会浪费。&/li&&li&Replica带来写性能和吞吐的下降。每次Index或者update的时候,需要先更新Primary Shard,更新成功后再并行去更新Replica,再加上长尾,写入性能会有不少的下降。&/li&&li&当出现热点或者需要紧急扩容的时候动态增加Replica慢。新Shard的数据需要完全从其他Shard拷贝,拷贝时间较长。&/li&&/ul&&p&上面介绍了Elasticsearch数据层的架构,以及副本策略带来的优势和不足,下面简单介绍了几种不同形式的分布式数据系统架构。&/p&&h2&分布式系统&/h2&&p&&b&第一种:基于本地文件系统的分布式系统&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c5f51b1b6cb5de1ab208_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&643& data-rawheight=&348& class=&origin_image zh-lightbox-thumb& width=&643& data-original=&https://pic1.zhimg.com/v2-c5f51b1b6cb5de1ab208_r.jpg&&&/figure&&p&上图中是一个基于本地磁盘存储数据的分布式系统。Index一共有3个Shard,每个Shard除了Primary Shard外,还有一个Replica Shard。当Node 3机器宕机或磁盘损坏的时候,首先确认P3已经不可用,重新选举R3位Primary Shard,此Shard发生主备切换。然后重新找一台机器Node 7,在Node7 上重新启动P3的新Replica。由于数据都会存在本地磁盘,此时需要将Shard 3的数据从Node 6上拷贝到Node7上。如果有200G数据,千兆网络,拷贝完需要1600秒。如果没有replica,则这1600秒内这些Shard就不能服务。&/p&&p&为了保证可靠性,就需要冗余Shard,会导致更多的物理资源消耗。&/p&&p&这种思想的另外一种表现形式是使用双集群,集群级别做备份。&/p&&p&在这种架构中,如果你的数据是在其他存储系统中生成的,比如HDFS/HBase,那么你还需要一个数据传输系统,将准备好的数据分发到相应的机器上。&/p&&p&这种架构中为了保证可用性和可靠性,需要双集群或者Replica才能用于生产环境,优势和副作用在上面介绍Elasticsearch的时候已经介绍过了,这里就就不赘述了。&/p&&p&Elasticsearch使用的就是这种架构方式。&/p&&p&&b&第二种:基于分布式文件系统的分布式系统(共享存储)&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b465a6ff1c5d1ae6f43dc79e260c7371_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&645& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&https://pic2.zhimg.com/v2-b465a6ff1c5d1ae6f43dc79e260c7371_r.jpg&&&/figure&&p&针对第一种架构中的问题,另一种思路是:&b&存储和计算分离&/b&。&/p&&p&第一种思路的问题根源是数据量大,拷贝数据耗时多,那么有没有办法可以不拷贝数据?为了实现这个目的,一种思路是底层存储层使用共享存储,每个Shard只需要连接到一个分布式文件系统中的一个目录/文件即可,Shard中不含有数据,只含有计算部分。相当于每个Node中只负责计算部分,存储部分放在底层的另一个分布式文件系统中,比如HDFS。&/p&&p&上图中,Node 1 连接到第一个文件;Node 2连接到第二个文件;Node3连接到第三个文件。当Node 3机器宕机后,只需要在Node 4机器上新建一个空的Shard,然后构造一个新连接,连接到底层分布式文件系统的第三个文件即可,创建连接的速度是很快的,总耗时会非常短。&/p&&p&这种是一种典型的存储和计算分离的架构,优势有以下几个方面:&/p&&ul&&li&在这种架构下,资源可以更加弹性,当存储不够的时候只需要扩容存储系统的容量;当计算不够的时候,只需要扩容计算部分容量。&/li&&li&存储和计算是独立管理的,资源管理粒度更小,管理更加精细化,浪费更少,结果就是总体成本可以更低。&/li&&li&负载更加突出,抗热点能力更强。一般热点问题基本都出现在计算部分,对于存储和计算分离系统,计算部分由于没有绑定数据,可以实时的扩容、缩容和迁移,当出现热点的时候,可以第一时间将计算调度到新节点上。&/li&&/ul&&p&这种架构同时也有一个不足:&/p&&ul&&li&访问分布式文件系统的性能可能不及访问本地文件系统。在上一代分布式文件系统中,这是一个比较明显的问题,但是目前使用了各种用户态协议栈后,这个差距已经越来越小了。&/li&&/ul&&p&HBase使用的就是这种架构方式。&/p&&p&Solr也支持这种形式的架构。&/p&&p&&b&总结&/b&&/p&&p&上述两种架构,各有优势和不足,对于某些架构中的不足或缺陷,思路不同,解决的方案也大相径庭,但是思路跨度越大,收益一般也越大。&/p&&p&上面只是介绍了分布式数据(存储/搜索/分析等等)系统在存储层的两种不同架构方式,希望能对大家有用。但是分布式系统架构设计所涉及的内容广,细节多,权衡点众,如果大家对某些领域或者方面有兴趣,也可以留言,后面再探讨。&/p&
分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大。这篇文章中,重点会讨论下分布式数据系统的设计,比如分布式存储系统,分布式搜索系统,分布式分析系统等。我们先来简单看下Elasticsearch的架构。Elasticse…
&figure&&img src=&https://pic4.zhimg.com/v2-a056a9fd6bb4_b.jpg& data-rawwidth=&950& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&950& data-original=&https://pic4.zhimg.com/v2-a056a9fd6bb4_r.jpg&&&/figure&&p&今天逛博客园,看到了一篇推荐的文章《&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/haoyifei/p/5687235.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&浅谈程序员的英语学习&/a&》,就点进去看了一下,对于文章中的观点我非常认同,英语是非常重要的,但文章站的高度还是太高,具体表述的学习方法我不是很认同,也认为不太实际,恰好之前有一篇一直没有发表到首页的文章想重新发布,今天就借此机会和大家很认真的谈一谈程序员的自我修养问题。&/p&&p&先介绍一下利益相关,我的背景:&/p&&blockquote&初中开始参加信息学与数学竞赛,大学本科软件工程专业,毕业后在银行做大数据分析与项目管理,后自主创业,做过传媒公司、软件外包公司,现在中国(南京)软件谷有个工作室,做些自己喜欢的事情。15年编码经验,6年创业经验。主要技术方向是.NET、HTML5、云服务、应用级开发等,自我整体水平评价为,资深程序员、初级架构师&/blockquote&&p&&br&&/p&&p&首先要谈的是,今天的话题所聊的程序员包含哪些人?&/p&&p&在说之前,不得不提到一个很有名的程序员赵劼,他有过一个观点:“坚决反对北大青鸟等机构”,以前我也很赞同这个观点,但是现在,&u&我在“赞同的基础上”,又坚决反对甚至反感赵劼们“发表这种观点”&/u&。因为这种观点,能够帮助并作用到的人群,是赵劼们最不可能遇到的&u&基层开发人员&/u&,而这些最不可能遇到的人,却恰恰是在中国的最普遍的程序员,他们也是赵劼们最不可能甚至不太愿意帮助的人。如果一个高阶程序员,自恃理科基础好,逻辑性强,有过完整的语言学习经历,就认为至少达到这样才是程序员,甚至觉得其他的不学数据结构的人就不要做程序了,那真是非常的妄自菲薄。&/p&&p&&u&在中国,写程序,不仅仅是一种兴趣,更多的时候,还是一种普通职业和谋生工具&/u&&/p&&p&大公司有厉害的程序员,优秀的架构师,但大量的小公司也有很多普通的程序员。在我这些年的工作经历中,也越来越深刻的感受到普通程序员的影响和力量。对于高阶程序员,所谓八仙过海各有神通,各有各的成就,各有各的修养,但程序员在达成较高的水平之前,有一些“自我修养”,&u&是最基础的,是普世的。&/u&&/p&&p&所以今天的话题面向的程序员,就是&u&所有的正在写代码或者曾经写过代码的程序员,也包括广义上的程序员,例如项目经理、架构师等等。&/u&&/p&&p&做任何事都是有明确目的,那么再谈一谈,程序员提高自我修养是为了什么?&/p&&p&程序写的好有人崇拜,有妹子喜欢?还是到博客、论坛、社区发表文章进行分享获得成就?我想这是少数人的追求,也是更高的追求,在这之前&/p&&p&我认为,&u&在中国&/u&,程序员提高自我修养的目的,是为了&/p&&p&&u&1、更好的融入工作,减少困难,增加成就&/u&&/p&&p&&u&2、稳步的提升能力,提高收入,达成财务自由&/u&&/p&&p&&u&2、站在更高的层面看待自己的学习和工作,树立更加适合的人生观价值观,家庭幸福,生活愉快&/u&&/p&&p&说的更通俗一点,就是&u&用更加合理的方式和方法,赚取到更多的收入&/u&&/p&&p&&br&&/p&&p&说了这么多废话,进入正题。何为程序员的自我修养?&/p&&p&正面论述很难说清楚,反向描述可能更通俗易懂一些,自我修养的对立面是“&u&没有修养&/u&”,先说一说在这么多年的工作、学习、生活中,遇到的一些我认为&u&“没有修养”的程序员形态&/u&:&/p&&p&1、程序员小张遇到了一个开发问题,很着急,想到了有几个群,于是到群里发了他的问题,坐等回答,发现没有人回答,就直接对话群主的QQ,群主也不回答,于是小张就搜索,突然搜到博客园有个帖子讲解了相关话题,他看完就给博主留言,我的邮箱是:&a href=&mailto:&&&/a&,麻烦博主把源码发给我一下,谢谢。&/p&&p&2、程序员小张进公司3个月了,老板布置了很多任务,他觉得老板很没人性,工资给的不高,加班也不给钱,于是在写代码的时候能省就省,客户反馈有问题也不主动解决,敷衍为主,又过了一个月,跳槽了。&/p&&p&3、程序员小张正在写一个功能模块,需要进行某种加密,到百度搜到了一个编码模块,看不明白具体写了什么,但是放到程序里刚好适用,于是就这么原封不动放进去了。&/p&&p&4、程序员小张要对某个功能进行研发,项目经理对他说,这个功能应该能搜索到,你去搜搜看,小张就在百度搜啊搜,一天过去了啥都没找到,项目经理来到小张身边坐下,换了个关键词,1分钟就搜到了解决方案。&/p&&p&5、程序员小张学.NET已经工作3年了,工资还是10000,和公司提涨工资也没答应,想跳槽又犹豫,这时某个前辈对他说,你去看书吧,多看一些书,例如《Visual C# 从入门到精通》,《CLR via C#》《Javascript权威指南》等等,于是小张买回来了, &br&随手翻了翻发现有些东西是他已经会的,有些看不懂的好像又用不到,而且书这么厚,要不要浪费时间去看呢?小张就这样反复纠结了半年,依然每天上班工作,下班LOL,偶尔还抱怨一下工资低。&/p&&p&6、程序员小张到了一家新公司,在做一个项目实现某个功能时,想起来以前做过这样的功能,可是竟想不起怎么实现了,于是就到自己电脑上找文档,找了好久也没找到,只好放弃,最后又折腾了2天,终于还是把这个功能给实现了。&/p&&p&7、程序员小张某天非常不高兴,因为他的项目经理和项目组的产品人员又变更需求了,新的需求又要对整个结构进行大的调整,小张很郁闷,到一个QQ里发泄情绪,说了这个事,于是立马,QQ群里面炸开锅了,程序员小李说,对,产品就是狗日的!程序员小王说,对,他妈的项目经理整天高枕无忧,就知道压榨开发人员!程序员小孙说,是的是的,我上一家公司也是这样,压榨程序员,幸好我走了。就这样,在一片骂声中,几个程序员心情舒畅了,小张开心的去玩王者荣耀去了。&/p&&p&我想,有些人可能已经明白我要说什么,有些人可能还不明白,具体的话我也说不出来,只能用一句话来概括就是:&/p&&p&在编写代码的过程中,&u&善于学习、掌握方法、勤加思考、勤奋努力、持之以恒&/u&,长此以往,在编程中,你会发现不一样的自己。&/p&&p&&br&&/p&&p&以上这些还是比较抽象,那么&/p&&p&提升自我修养的具体方法有哪些?&/p&&p&程序员具体如何达成“较高的修养”,每个人各有自己的办法,我无法说到很细,就和如何提高做人修养一样,一句两句话是说不清楚的,但是有些说法也通俗易懂,比如一个小孩,有教育良好的父母,父母彬彬有礼,小孩从小开始接受正规教育,小学、初中、高中、大学,然后文化课程和社会实践良好,那么这个小孩最终的做人修养,一定比没有经历过这个过程的小孩更好一些。&/p&&p&同样的,写程序也是如是,下面我就讲一些最基本的、最浅显易懂的学习方法和道理,我把它叫做:&b&程序员基础的基础。&/b&&/p&&p&一个好的开发人员,应该能够全面、高效、严谨的去处理任何软件程序和业务问题,成为一个好的开发,是一个很有意思的话题,不过无论这个话题如何开展,基础两个字必不可少,虽然代码量是衡量开发能力的重要指标,但仅能够熟练的进行代码编写是不够的,更要能深刻的理解技术原理和业务逻辑,扎实的个人基础和技术基础往往会促进代码的编写,更游刃有余的解决问题。&/p&&p&下面说的一些基础,可能绝大部分开发人员都不会在意甚至忽略,但恰恰这些才是开发大厦的基石。&/p&&p&&b&1、科学基础&/b&&/p&&p&成为开发人员的过程不尽相同,有的是科班出身,有的是兴趣爱好,还有的是专业机构的培训,在这个过程中,可能全面或者零散甚至没有学习过计算机基础学科,但无论是哪一种,想要成为更高层次的开发人员,写出更高质量的代码,计算机基础学科的学习,是非常非常非常(重要的事情说三遍)重要的。具体的来说,基础学科在实践应用中,有如下几门是一定需要的,按照学习顺序排列如下&/p&&p&1)数据结构&/p&&p&数据结构课程通俗的说就是告诉你如何用最基本的语言类型、变量,关键词语句等,去处理各式各样的逻辑问题,我们称之为算法,而日常编程中的各种问题,例如排序、文件夹遍历操作、数据库查询等,都可以在数据结构课程中,找到对应的数学原型。数据结构课程的理解能力,也是一个人数学能力的体现,数据结构学习的好坏,是程序员水平差异的一个重要分水岭,对于这一块内容的学习,有如下建议:使用VB、C、C++、Pascal等语言,买一本相关语言数据结构与算法的书,或者在网上下载相关的PDF电子书,完整的学习一边,并将书本中的所有案例亲自编写运行调试一遍,当能够领悟到某些日常编程中常见手法源于某些数据结构和算法时,就基本达到了学习效果。&/p&&p&2)操作系统&/p&&p&所有编程语言的开发以及应用的运行,都基于操作系统,桌面编程中的大部分场景包括内存、进程、文件系统、网络通讯、用户界面等,都源于操作系统的定义和概念,完整的了解操作系统的起源和组成以及运行逻辑,对多线程、复杂界面、文件管理以及一些难以正常理解编程思路等开发中遇到的场景,有非常大的帮助,不仅帮助理解,也能掌握更多有效的程序写法。具体可以买一本操作系统的书或者下载相关PDF电子书,完整的浏览一遍,做到能够结合实际编程场景来看待操作系统原理,就基本达到了学习效果。&/p&&p&3)数据库&/p&&p&传统的关系型数据库,入门简单,深入却难,往往开发人员能够较快的掌握增删改查、视图、索引、存储过程等基本数据库操作,却在编写复杂查询、设计主外键、优化字段、去除冗余等时,出现只会依葫芦画瓢却不能自主思考扩展的状况。究其原因还是没能了解关系数据库的根本原理,而数据库这一门课程,系统的阐述了关系型数据库的来龙去脉,了解其中的数学原理或逻辑基础所在,对提升数据库编程水平有质的影响。建议也是买一本数据库的相关书籍或者下载PDF电子书,能够把熟练的把第一范式、第二范式等数据库课程的基本知识点与数据库编程场景建立起关联,也基本达到了学习效果。&/p&&p&4)编译原理&/p&&p&编译原理是编程语言以及各类语言编译器的科学基础,可以说编译原理创造了世界上的几乎所有的IT应用,学习编译原理的基础是数据结构和算法,因此编译原理的学习要花费更多的时间和精力,由于现代高级编程语言的编译器,在代码优化、资源优化方面已经做的足够智能,因此,编译原理的学习对实战的影响越来越小,但是正所谓本盛末荣,如果认为自己对数据结构和算法的学习达到了一个较高的水平和状态,可以在编译原理学习上进一步深入,最终把自己和普通程序员拉开更大的差距。&/p&&p&&b&2、英语能力&/b&&/p&&p&英语的天然特性和字母长度还有学科发展的历史因素,决定了编程语言一定是基于英语的,在编程过程中,从语言的关键词到文档的内容又或是搜索引擎的搜索结果,都不可避免的会遇到英文。大部分编程人员,都具备英语四级左右的英文基础,却由于非专业以及工作环境原因,逐渐疏远甚至完全淡忘了英语。而实际操作中,大部分编程语言资料都是英文,在线编程问答内容也是英文,因此,很有必要把英语能力重新恢复到一个不用太高但行之有效的水平,达到如下效果:&/p&&p&1)对自己所使用语言,每一个关键词都知道具体的英文翻译、逻辑含义以及读音。&/p&&p&2)对于自己使用语言所涉及到的相关方法、类库、框架、工具等,能知道其中每一个方法、过程以及参数关键词等的英文翻译、逻辑含义以及读音。&/p&&p&3)对常见的编程逻辑和核心关键词,能够用英文组织问题的描述,最简答的也行,只要能被搜索引擎读懂就可以。比如如何在C#中把整形转换为字符串类型这个问题,最简易的英文描述就是 C# Integer Covert To String。&/p&&p&4)在自己技术知识范围内的任何的英文的技术手册、文档、文章或是问题描述,能够读懂8成的内容含义,能够读懂完整的技术含义。&/p&&p&&b&3、搜索方法&/b&&/p&&p&任何一个开发人员,都应当具备搜索能力,甚至是一定要具备搜索能力,搜索引擎的宝藏,是无穷无尽的,同样具备搜索意识的不同程序员,却因为搜索技巧的差异最终在程序开发质量、项目实施效率、甚至是工程产品质量上出现数倍的差异,因此,掌握高效、先进、灵活的搜索方法和技巧,是非常非常非常(重要的事情说三遍)有用的。其中主要的方法介绍如下:&/p&&p&1)搜索源选择&/p&&ul&&li&虽然英文的编程资料更为准确高效,但中文的编程资料数量上却占优,因此遇到问题第一搜索选择还是百度&/li&&li&谷歌对于专业中文词汇的处理能力有时候甚至比百度还要强,而且谷歌能搜出大量的英文资源,因此谷歌也是首选之一,但是由于谷歌被封锁,因此需要进行VPN、SSH等FQ操作,或者在百度搜索“谷歌镜像”关键词,通过谷歌的镜像网站进行访问。&/li&&li&除了搜索引擎,专业的技术网站、论坛、社区也是非常直接有效的搜索源,比如国外的StackOverFlow网站,国内的Cnblogs博客园、OSChina开源中国等,都具备搜索功能,将问题关键词输入其中,也许也会很快的得到相关答案。&/li&&li&对于QQ群,建议不要使用,除非QQ群主或者成员是非常闲或者非常非常热心的人,否则在QQ群询问技术问题,是非常低效率的搜索方式。&/li&&/ul&&p&2)关键词构造&/p&&p&搜索关键词的构造,直接影响搜索效率和正确结果的过滤,没有什么特别的技巧,关键在于搜索积累,但是总体遵循的原则是,准确和简洁,比如当出现一个描述,如何用C#对XML进行序列化和反序列化,非常愚蠢的关键词构造就是“如何用C#对XML进行序列化和反序列化”,而正确高效的关键词则是“C#&br& XML 序列化 反序列化”,或者在谷歌里面搜索则是“C# XML Serialization”。在平时的编程中,一定要注意相关方法和经验的积累&/p&&p&3)联想搜索&/p&&p&联想搜索,不属于搜索引擎的范畴,却是在搜索中很有用的高级技巧,举一个通俗的例子,比如想使用C#,利用某个.NET类处理一种HTTP通讯,但是一直搜索不到完美的结果,不过换个思路,考虑到&a href=&https://link.zhihu.com/?target=http%3A//VB.NET& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&VB.NET&/span&&span class=&invisible&&&/span&&/a&也是.NET体系,和C#完全相通,那么也可以试着用&a href=&https://link.zhihu.com/?target=http%3A//VB.NET& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&VB.NET&/span&&span class=&invisible&&&/span&&/a&关键词进行搜索,搜索到完美代码后再临摹成C#代码。这样的联想搜索,不仅能够帮助搜索正确结果,也是对大脑思维的训练,值得多多尝试。&/p&&p&4)资源搜索&/p&&p&开源的框架、产品、工具、控件等开发辅助类东西越来越多,稳健性和迭代性越来越强,去寻找一款成熟的工具或者插件,也成为了大量开发者的必备方法和技能,而如何高效的搜索出想要的资源,也成为了一门学问,其核心方法就在于知晓资源网站的地址,常见的例如有开源中国、Github、CSDN下载、pudn等。资源类网站需要平时多积累,到用到的时候会非常关键。&/p&&p&&b&4、思维模式&/b&&/p&&p&开发人员,一定要养成业务思维的模式,所谓的业务思维,就是在做任何一个项目的时候,写任何代码前,需要对项目本身的业务概念和业务逻辑甚至业务流程都要有一个全面的学习和理解,这虽然不是一个项目的强制要求,却是一个很好的开发习惯,无论自己的觉得是开发者还是测试员又或是技术总监,掌握了业务原理,才能够更好的设计或阅读项目的数据结构和流程结构。程序员的思维往往和用户或者客户是不一致的,摆脱技术思维模式,习惯于用业务思维解决问题的程序员,不一定最优秀,但一定是一个很容易沟通的程序员&/p&&p&&b&5、工作与编程习惯&/b&&/p&&p&有的人说爱干净浪费时间,所以不修边幅,但归根结底这还是习惯问题,当养成清洁卫生的习惯并使之成为生活惯性时,往往就不会耗费更多的时间,反而显得干净干练。写程序同样如是,有一些编程习惯,看似不足为道,看似浪费时间,可是如果坚持下去,最终都能收到意想不到的奇效。下面列举一些特别重要的习惯。&/p&&p&1)快捷键的使用&/p&&p&无论是使用Windows、Linux操作系统,还是在IDE中,快捷键都是系统本身的标配,事实上,Ctrl+C、V这样的操作,大部分人都能尝到在节省时间上的甜头,把这个概念进一步扩散,如果在IDE中编写代码,除了代码本身,将其余所有的鼠标操作、键盘定位操作,都用快捷键来代替的话,在时间上将会有数量级的节省,然而看上去这么好的事情,真正坚持去执行并形成习惯的人屈指可数,因此,在初期的改变习惯,记住快捷键,会是一个长期的过程,需要不断的坚持。&/p&&p&2)代码注释&/p&&p&一个开发人员随着年龄和经验的增长,所参与的项目,再也不是靠一个人或者几个人就能完成的。系统的重构、代码的重构、工作的交接、对新进人员的培训等等类似的事情,会越来越多的遇到,这些事情无一例外都会把已经写过的代码重新或者重复阅读,如果在初始编写代码时,就做到完整、清晰明了的代码注释,对后续工作会有巨大的帮助。不仅提高工作效率,还能增强合作好感。事实上,就算只是自己看自己的代码,如果有注释,也能加深印象,缩短代码查找时间。因此,任何开发人员,都应该养成良好的代码注释习惯。&/p&&p&优秀的代码注释应该能做到:&/p&&ul&&li&每一个函数、每一个属性甚至是变量的划分,都可以找到对应的解释。&/li&&li&多使用越来越被IDE支持的XML注释方式,不仅有注释文字,更有详细的参数描述。&/li&&li&对程序结构、模块、组成部分划分等也加以注释&/li&&/ul&&p&3)命名规则&/p&&p&具备一定规模的软件公司,在代码编写上都有一套自己的命名规则,涵盖项目、模块、函数、变量等等,标准化命名的好处不言而喻,然而被动、被迫去遵守命名规则和主动习惯于使用命名规则是完全不一样的。一个优秀的开发人员,应当发自内心的希望各种代码命名都是有规则的,易读的,而不是纠结于命名规则会增加码字长度。&/p&&p&4)不将就的编程逻辑&/p&&p&所谓不将就的编程逻辑,其对立面就是不讲究的编程逻辑,不讲究的编程,不仅是一种很坏的编程习惯,也体现了低下的生活品质,很多开发人员,因为个人习惯、赶工期、客户要求不高等多种原因,在编程时特别随意,体现在比如为了实现某个功能,百度出一段代码,直接套用,10行的代码只理解8行,有两行看不懂也放到程序里去使用,很多这样的小细节,就好比在项目中埋下了无数的定时炸弹,不仅有很大概率形成返工,更是为项目埋下了风险。编程人员,应当有担当有态度,养成不将就的编程逻辑,不勉强自己,也不轻视程序。&/p&&p&5)数据备份&/p&&p&误删、误操作、电脑断电、文件遗失等等状况是每一个开发按人员都可能遇到的问题,如果不希望辛勤的劳作被浪费,不希望偶然的意外影响工作,那做好备份是必不可少的,在较大规模的公司,会有完整的源代码管理以及信息安全防护,而无论是在大公司工作,还是身处较小公司或者在实现个人代码价值时,都要做好代码和文档的数据备份,备份方式的选择灵活多样,有使用在线的CVS、SVN、TFS、Git源代码管理,也可以手工拷贝文件至云空间或者本地硬盘,甚至可以在个人电脑上组成RAID磁盘阵列等等,养成周期性、规律性的备份习惯。&/p&&p&6)邮件工作方式&/p&&p&沟通是进步的源泉,如果说开发小组的热烈讨论是性格和激情的体现,那邮件的工作方式也是另一种稳重和高效。无论是公司层面的工作沟通,还是开发小组的问题交流,邮件的作用包括问题正规化描述、工作留档留痕、工作流程流转、责任分工明确等等,习惯于将重大问题、重要事项通过邮件的方式与同事、主管等进行沟通,将会非常有助于团队协作。&/p&&p&&u&以上这些方法,是我这么多年来的感受和体会,也给了我很大的帮助,希望也能够帮助到大家,不能说一定可以“提升修养“,但也是”提升修养”的有效方式。&/u&&/p&&p&&br&&/p&&p&最后还想再说一说坚持的力量&/p&&p&分享一个真实的小故事,公司有两个开发人员,1个做.NET好多年了,但是很油滑,做事能省就省,抓到可以偷懒的机会就偷懒,让他学点新知识新方法总是自以为是觉得自己都会;还有1个毫无.NET基础,一直做低级语言开发,从15年才开始学习.NET和Web前端,但是做事很积极,几乎每天都自己抽空学习,遇到不懂的都琢磨清楚,遇到不会的场景就上网或者找人寻求帮助,项目结束后还反复思考有什么地方可以改进。从15年到现在,短短1年,这两个人的发展已经是天壤之别,工资差距也越来越大,后者已经能够独自操盘中小型软件外包项目,而前者还在混着日子,以后他们各自的发展也完全可以预见。&/p&&p&我想说的是,本篇里面分享的一些道理和方法,都是通俗易懂的,就和常听到的例如101%和99%的365次方的故事、1万小时的道理等等一样,但真正去认真思考并实践的屈指可数,也许,坚持才是程序员最大的修养,和各位共勉!&/p&&p&注:本文作者张柔,发布于博客园,原文链接:&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/horizon_line/article/details/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/horizon_l&/span&&span class=&invisible&&ine/article/details/&/span&&span class=&ellipsis&&&/span&&/a&。努力做一只IT干货的勤劳的小蜜蜂,喜欢就给个赞呗!&/p&
今天逛博客园,看到了一篇推荐的文章《》,就点进去看了一下,对于文章中的观点我非常认同,英语是非常重要的,但文章站的高度还是太高,具体表述的学习方法我不是很认同,也认为不太实际,恰好之前有一篇一直没有发表到首页的文章想重…
终于可以来回答这道题了……&br&&br&一年多前,也就是大一下学期末的时候,我看到这个问题下 &a data-title=&@fleuria& data-editable=&true& class=&member_mention& href=&//www.zhihu.com/people/aed& data-hash=&aed& data-hovercard=&p$b$aed&&@fleuria&/a&
叔的答案,然后看了 F 叔给的这个链接 &a class=& wrap external& href=&//link.zhihu.com/?target=http%3A//fleurer-lee.com/paper.html& target=&_blank& rel=&nofollow noreferrer&&基于 Bochs 的操作系统内核实现&/a&
,当然是什么都看不懂,除了惊诧之外也了解了一件事情:&b&一个人写一个简单的操作系统内核是一件非常帅气并且可行的事情。&/b&&br&&br&于是我开始写了,那时候我的水平大概是:只会做 C 语言的习题,编译的话只知道按 F9,汇编知道常见的指令,另外会一点点的 Win 32 编程,能流畅使用 Windows。&br&&br&一开始我找了《30 天自制操作系统》来看,每天看书,然后把从书里把代码打出来,一次一次地编译运行。因为要同时写汇编和 C,所以从那时候起就开始用 vim。&br&&br&在啃完了差不多半本书后,开始觉得没意思了……因为觉得作者为了让内容更简单而省略了太多细节。也看了于渊的《Orange‘s 一个操作系统的诞生》,依然没看下去:汇编用得太多了。期间也曾斗胆发邮件给 F叔,然后他推荐了 &a class=& wrap external& href=&//link.zhihu.com/?target=http%3A//www.osdever.net/bkerndev/Docs/gettingstarted.htm& target=&_blank& rel=&nofollow noreferrer&&Bran's Kernel Development Tutorial&/a& 这个教程,于是我就从这教程重新开始了: &a class=& wrap external& href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/lastavengers/p/4115612.html& target=&_blank& rel=&nofollow noreferrer&&「30天自制操作系统」 Stop & 「OS67 」 Start&/a&&br&&br&那时候大概是大二上学期,于是在 github 上又开了一个 repo,一开始在 Windows 下开发,后来又切换到了 Linux 下,因为 Bran's 用的 bootloader 是 Grub,不符合我的初衷,所以就自己写了一个,之后便跟一路教程写,跨过了保护模式这道坎,完成了基本的设备驱动。 &br&&br&在完成 Bran's 后,我又部分参考了 &a class=&internal& href=&http://www.zhihu.com/question//answer/&&写一个操作系统内核有多难?大概的内容、步骤是什么? - To浅墨的回答&/a& 中推荐的:&a href=&//link.zhihu.com/?target=https%3A//github.com/hurley25/hurlex-doc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hurley25/hurlex-doc · GitHub&/a&
文档,完成了一些简单的调试函数和库函数,printk 和内存分配。&br&事实证明,&b&尽早写好调试函数诸如 panic, assert 和 printk 是非常重要的。&/b& 大量地使用有助于你尽快地发现 bug (当然前提是这些函数本身不能有 bug)。&br&&br&看完了 hurlex-doc 该看的部分后,很长一段时间了都不知道该干嘛好,模仿 hurlex-doc 里的内核线程切换也一直出错。这一情况一直持续到我开始读 &b&&a class=& wrap external& href=&//link.zhihu.com/?target=https%3A//pdos.csail.mit.edu/6.828/2011/xv6.html& target=&_blank& rel=&nofollow noreferrer&&Xv6, a simple Unix-like teaching operating system&/a& 。&/b&&br&&br&如果你去看知乎关于「自制内核」的问题,你会发现 xv6 被反复地提及并推荐,事实上它非常值得被推荐:这是我读完大部分代码之后真切体会到的。&br&&br&之前的 Bran‘s 和 hurlex-doc 的篇幅都比较小,我是在电脑和 kindle 上看完的,xv6 相对来说代码量比较大,有 9000+ 行和一份文档,之后我又找到了这个:&a class=& wrap external& href=&//link.zhihu.com/?target=https%3A//github.com/ranxian/xv6-chinese& target=&_blank& rel=&nofollow noreferrer&&ranxian/xv6-chinese · GitHub &/a&xv6 文档的中文译版,所以我就去花了十二块钱学校打印店打印了一份中文文档和一份代码。这又是一个正确的决定,让我不必对着电脑就能看代码。&br&&br&在之后的时间里,我先读了 xv6 中文件系统相关的部分,然后改写它的代码为我的内核添加了一个 类似 Minix 的文件系统。 然后几乎又照抄了其中了进程调度的部分(做了部分简化),又在原来的代码基础上为添加操作系统的接口,接着写用户程序,过程几乎是「一路顺风」。看 xv6 的那段时间也经常是处于醍醐灌顶的状态。&br&&br&最后我终于在差不多一个月前完成了这个简陋的操作系统内核:&br&&a class=& wrap external& href=&//link.zhihu.com/?target=https%3A//github.com/LastAvenger/OS67& target=&_blank& rel=&nofollow noreferrer&&LastAvenger/OS67 · GitHub&/a&
(没错其实我是来骗 star 的)&br&&br&历时一年,一路点亮了不少技能树(虽然都点得不好),这样算是「从零开始写一个简单的操作系统」么? 跟进一步说,有谁不是从零开始的呢?&b& 所以想做的话,现在就开始做好了。&/b&&br&&figure&&img data-rawheight=&205& data-rawwidth=&470& src=&https://pic2.zhimg.com/50/1c5aeebebc4ebe_b.jpg& class=&origin_image zh-lightbox-thumb& width=&470& data-original=&https://pic2.zhimg.com/50/1c5aeebebc4ebe_r.jpg&&&/figure&这是被「翻烂」了的 xv6 源代码和中文文档(其实是放书包里被磨烂了)&br&&figure&&img data-rawheight=&1228& data-rawwidth=&1632& src=&https://pic2.zhimg.com/50/ab3f5d662bec_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1632& data-original=&https://pic2.zhimg.com/50/ab3f5d662bec_r.jpg&&&/figure&&br&「故事」讲完了,接下来说一点经验之谈吧……&br&&br&* 知乎上总是有人在讨论「做一个玩具编译器和做一个玩具内核何者更有趣」之类的问题,然后总有各种大V 跳出来说内核有多 dirty 而编译器多 clean,事实上除了 CPU 上的几个表因为历史原因长得恶心一点,内核并没有什么特别 dirty 的地方,另外,想做点什么打发时间,不过是两个代码量稍多的入门项目,有什么好纠结的?&br&* 写内核的过程中,你会接触到一些这辈子大概只会用到一次的知识,A20 线已经成为历史,日常的编程里面也不需要你懂得 GDT IDT 的结构。但是单凭内核主要部分部分(文件系统,进程,内存)给你带来的知识而言,这点冗余是值得的。 &br&*&b& 尽早实现调试函数&/b&并大量使用,善于利用 bochs 的内置调试器,能省下你不少时间。&br&* 有时候觉得书里的做法非常奇怪,你觉得你有更好的做法,&b&一般是你想错了&/b&。(当然只是一般)&br&* 上面说看 xv6 一路顺风是假的,&b&20% 时间在抄代码,80% 的时间用来调试&/b&。&br&* 对我这种能力一般的人来说,「写内核」只是好听的说法,正确的说法是「抄内核」。当然,就算是抄一个,也算是受益匪浅了。&br&* 抄 xv6 的好处在于,即使你的代码出错了,你可以坚信,正确的答案肯定在 xv6 的代码里,或许只是你还没理解透而已,只要不断地看和理解,你就离正确的道路越来越近。&br&&br&最后,感谢 &a class=&member_mention& href=&//www.zhihu.com/people/aed& data-hash=&aed& data-hovercard=&p$b$aed&&@fleuria&/a& 在微博和邮件里的多次帮助, &a class=&member_mention& href=&//www.zhihu.com/people/fbacc204b& data-hash=&fbacc204b& data-hovercard=&p$b$fbacc204b&&@To浅墨&/a&
的 hurlex-doc 文档,鲜染同学翻译的 xv6 中文文档, &a class=&member_mention& href=&//www.zhihu.com/people/c2cf0bda36fc92d96fd52e78b85612ce& data-hash=&c2cf0bda36fc92d96fd52e78b85612ce& data-hovercard=&p$b$c2cf0bda36fc92d96fd52e78b85612ce&&@郭家华&/a& 完美地解答了我一开始的疑问,让我在内核中得以使用 C 语言。&br&在 #archlinuxcn 频道里也得到了很多人的帮助。
终于可以来回答这道题了…… 一年多前,也就是大一下学期末的时候,我看到这个问题下
叔的答案,然后看了 F 叔给的这个链接
,当然是什么都看不懂,除了惊诧之外也了解了一件事情:一个人写一个简单的操作系统内核…
&p&&b&今天给大家安利一款简直是相见恨晚的一款神器,严重推荐,不好用你找我!你们知道吗,当我用的时候只恨自己没早点发现啊!白忍受了这么多年!&/b&&/p&&p&事情的经过是这样的,最近想尝试一下Mac 系统,就在自己的台式机上祭出了虚拟机大法,折腾了一晚上成功安装上了Mac OS X 10.10。&/p&&p&&br&&/p&&p&11.14插入——&/p&&p&看到评论里那么多想要安装虚拟 mac 系统的流程,昨晚连夜又重装一次, 截了50多张图,做了这份教程 &a href=&//link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/z4xDqIFnLT9GyYAXWl3XSw& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&史上最详细教程!Windows上安装Mac OS!多图必收藏!&/a&&/p&&p&以下是原答案——&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-2f9deadc71ce109e1baeeb1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&694& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/50/v2-2f9deadc71ce109e1baeeb1_r.jpg&&&/figure&&p&然后就一直在新装的苹果系统上折腾,切换回 Windows
10 突然觉得非常不适应,总感觉没有 Mac OS 简洁,漂亮,这不是桌面、壁纸、图标的问题。&/p&&p&最后想明白了,问题出在&b&字体&/b&上。&/p&&p&来看看同一个网页的截图对比:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-7e68eeb37ddec437b08afe1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1115& data-rawheight=&925& class=&origin_image zh-lightbox-thumb& width=&1115& data-original=&https://pic4.zhimg.com/50/v2-7e68eeb37ddec437b08afe1_r.jpg&&&/figure&&p&Windows
效果 ▲&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-f2d07bfa3d21878bdc11c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1005& data-rawheight=&807& class=&origin_image zh-lightbox-thumb& width=&1005& data-original=&https://pic3.zhimg.com/50/v2-f2d07bfa3d21878bdc11c_r.jpg&&&/figure&&p&Mac
效果 ▲&/p&&p&(知乎图片压缩太厉害了啊,这样的渣画质怎么对比啊)发现问题了吧, Mac OS 的字体渲染比 Windows 的漂亮太多了,通常这种事情用习惯了也不觉得有什么,可你千万别比,一比就露怯。郭德纲那句话怎么说来着,不是我们做的有多出色,都是同行衬托的。&/p&&p&你看,看惯了苹果的字体,再怎么看 Windows 都觉得不舒服,有没有办法让Windows 上的字体也能像苹果那样优雅美观呢?&/p&&p&还真有,这款软件就是 MacType,它能接管 Windows 的 GDI 字体渲染功能,实现比 Mac OS 更华丽的字体渲染效果!&/p&&p&当我打开 MacType 的渲染效果后,再看电脑屏幕,就像&b&近视眼第一次戴上了眼镜,世界为之一亮&/b&!&/p&&p&少啰嗦,上图看效果:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-3b288eec3c861c0a44ae0c_b.jpg& data-size=&normal& data-rawwidth=&668& data-rawheight=&317& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&https://pic3.zhimg.com/50/v2-3b288eec3c861c0a44ae0c_r.jpg&&&figcaption&Windows 效果 ▲&/figcaption&&/figure&&figure&&img src=&https://pic3.zhimg.com/50/v2-85729adce50e6fbc1f0986_b.jpg& data-size=&normal& data-rawwidth=&663& data-rawheight=&323& class=&origin_image zh-lightbox-thumb& width=&663& data-original=&https://pic3.zhimg.com/50/v2-85729adce50e6fbc1f0986_r.jpg&&&figcaption&MacType 效果▲&/figcaption&&/figure&&figure&&img src=&https://pic4.zhimg.com/50/v2-406c3e764e31e3e98bde21d5211913be_b.jpg& data-size=&normal& data-rawwidth=&1041& data-rawheight=&609& class=&origin_image zh-lightbox-thumb& width=&1041& data-original=&https://pic4.zhimg.com/50/v2-406c3e764e31e3e98bde21d5211913be_r.jpg&&&figcaption&Windows 效果 ▲&/figcaption&&/figure&&figure&&img src=&https://pic2.zhimg.com/50/v2-7cb52f3913fc4dcccd96cb85c7665f74_b.jpg& data-size=&normal& data-rawwidth=&1020& data-rawheight=&611& class=&origin_image zh-lightbox-thumb& width=&1020& data-original=&https://pic2.zhimg.com/50/v2-7cb52f3913fc4dcccd96cb85c7665f74_r.jpg&&&figcaption&MacType 效果▲&/figcaption&&/figure&&figure&&img src=&https://pic2.zhimg.com/50/v2-ee0f7a29c9c1c8fcfc3bbfc5082cdae9_b.jpg& data-size=&normal& data-rawwidth=&179& data-rawheight=&266& class=&content_image& width=&179&&&figcaption&Windows 效果 ▲ &/figcaption&&/figure&&figure&&img src=&https://pic2.zhimg.com/50/v2-488ca1a14aa63efadc27cde_b.jpg& data-size=&normal& data-rawwidth=&179& data-rawheight=&266& class=&content_image& width=&179&&&figcaption& MacType 效果▲&/figcaption&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/v2-784a2acfd51faddeeff63952bbff9697_b.jpg& data-size=&normal& data-rawwidth=&508& data-rawheight=&176& class=&origin_image zh-lightbox-thumb& width=&508& data-original=&https://pic1.zhimg.com/50/v2-784a2acfd51faddeeff63952bbff9697_r.jpg&&&figcaption&Windows 效果 ▲ (点开大图看划线处的边缘)&/figcaption&&/figure&&figure&&img src=&https://pic2.zhimg.com/50/v2-720e3fea9f1e78c9083770_b.jpg& data-size=&normal& data-rawwidth=&507& data-rawheight=&175& class=&origin_image zh-lightbox-thumb& width=&507& data-original=&https://pic2.zhimg.com/50/v2-720e3fea9f1e78c9083770_r.jpg&&&figcaption&MacType 效果▲&/figcaption&&/figure&&p&看,有些东西就是这样,不知道也就罢了,一旦见识到了,就很难再回去了。昨天刚知道这款软件的时候,当时第一感觉就是,居然今天才知道这款软件,真的是白瞎玩了这么多年电脑!&/p&&p&MacType 为什么能够做出比 Windows 官方系统漂亮得多的字体渲染效果?&/p&&p&查阅了一些资料,简单地说, Windows 追求的是字体足够清晰,不惜扭曲字体本身,只在&b&文字的横轴进行灰度抗锯齿&/b&,不考虑&b&纵轴的渲染效果&/b&;MacType 则完全以&b&保留字体曲线&/b&为根本的渲染,兼顾文字的纵向和横线渲染,最大限度地在屏幕上展现&b&印刷后的效果&/b&。这是两种理念上的区别。(理解若有误,还请指正)&/p&&p&你知道像我这样爱美化系统的神经病来说,遇到这种东西不用我能忍?&/p&&p&软件可从官网地址&b&&a href=&//link.zhihu.com/?target=http%3A//www.mactype.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&mactype.net&/span&&span class=&invisible&&&/span&&/a&&/b&下载,安装完成后打开 MacType,仔细看有几种不同的加载方式,初用者建议使用托盘独立加载模式,可随时停止或启动对任意程序的渲染,当使用过一段时间之后在考虑使用注册表加载,以便获得最好的渲染效果。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-fb1dd32c7b7c9baf06b9e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&942& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&942& data-original=&https://pic1.zhimg.com/50/v2-fb1dd32c7b7c9baf06b9e_r.jpg&&&/figure&&p&我测试的应用环境是 Windows 10 64位专业版,目前还没遇到大的问题,只顾看着美滋滋了,建议使用软件默认的配置方案效果就很不错,想继续折腾的同学可在网上搜搜第三方的配置方案,也许还会有更好的效果。&/p&&p&这真的是一款颠覆我认知的软件,虽然玩了这么多年电脑,仍然还是有一些软件之前闻所未闻,却为你打开了新世界的大门!&/p&&p&最后在结束今天的安利之前,再放一张知乎首页截图美一下!&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-87ffa1b23b31dc3ce5f713_b.jpg& data-size=&normal& data-rawwidth=&836& data-rawheight=&772& class=&origin_image zh-lightbox-thumb& width=&836& data-original=&https://pic4.zhimg.com/50/v2-87ffa1b23b31dc3ce5f713_r.jpg&&&figcaption&Windows 效果 ▲&/figcaption&&/figure&&figure&&img src=&https://pic2.zhimg.com/50/v2-dc77e4d2d283acbb2eac3d3_b.jpg& data-size=&normal& data-rawwidth=&837& data-rawheight=&669& class=&origin_image zh-lightbox-thumb& width=&837& data-original=&https://pic2.zhimg.com/50/v2-dc77e4d2d283acbb2eac3d3_r.jpg&&&figcaption&MacType 效果▲&/figcaption&&/figure&&p&&b&注意:有win7的同学反映安装后蓝屏无法启动,建议不要轻易尝试!&/b&&/p&&p&知乎的图片实在是压缩的太厉害了,感兴趣的话可以去我公众号,发的有这篇,我会定期介绍一下好玩好用的软件。&/p&&p&比如你可能还喜欢——&/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&马小帅:百度云管家如何突破它的下载限速?&/a&&/p&&a href=&https://www.zhihu.com/question//answer/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic2.zhimg.com/80/v2-8e9cad05e06e66e5bc117c0748c6ffe5_180x120.jpg& data-image-width=&1080& data-image-height=&290& class=&internal&&网络上有哪些免费的教育资源?&/a&&a href=&https://www.zhihu.com/question//answer/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic2.zhimg.com/80/v2-8e7f583aba5f1_180x120.jpg& data-image-width=&947& data-image-height=&648& class=&internal&&百度云管家如何突破它的下载限速?&/a&&a href=&https://www.zhihu.com/question//answer/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/80/v2-d594cecc58_ipico.jpg& data-image-width=&1080& data-image-height=&956& class=&internal&&有哪些不为外行所知的好产品或好品牌?&/a&&p&&i&硬广时间:&/i&&/p&&p&&i&本文在&b&&a href=&https://zhuanlan.zhihu.com/c_& class=&internal&&网罗灯下黑&/a&&/b&知乎专栏及同名微信公众号(&b&wldxh8&/b&)&/i& &i&同步更新,里面还有科技圈里不为人知的隐秘故事,趣玩软件,毒舌吐槽,欢迎来玩。&/i&&/p&
今天给大家安利一款简直是相见恨晚的一款神器,严重推荐,不好用你找我!你们知道吗,当我用的时候只恨自己没早点发现啊!白忍受了这么多年!事情的经过是这样的,最近想尝试一下Mac 系统,就在自己的台式机上祭出了虚拟机大法,折腾了一晚上成功安装上了Ma…
&p&作为 GitHub 中国区首席 markdown 工程师,我们公司的 HR 经常找我来鉴定的。&/p&&br&&p&从首页来看,我只关心三部分:&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-6facab6ce6d21cbefcd40e2d7415fc81_b.jpg& data-rawwidth=&2028& data-rawheight=&1588& class=&origin_image zh-lightbox-thumb& width=&2028& data-original=&https://pic2.zhimg.com/50/v2-6facab6ce6d21cbefcd40e2d7415fc81_r.jpg&&&/figure&&br&&p&1. 活跃时间。如果是在最近三个月,才在 GitHub上活跃的,那么这肯定是为了&b&找工作做准备的。&/b&&/p&&p&2.
star 数代表了&b&受欢迎程度&/b&。star 数并不能代表候选人的真实能力,但是它可以代表候选人的影响力。&/p&&p&3. 擅长的语言类型。GitHub 的语言识别可以减少一些麻烦,如我 GitHub 首页的两个高 star 的 HTML 项目都是电子书。而,像那些&b&只有 README 的项目&/b&是不会有语言的。&/p&&br&&p&接着,我便会看项目的两个内容:&/p&&p&1. 工程实践&/p&&p&2. 少部分代码(一般情况下,我都不会看代码的,有点浪费时间)&/p&&p&工程实践,主要从&b&README、项目目录、提交历史&/b&看起:&/p&&br&&h2&&b&README&/b& &/h2&&p&主要看有没有写得很规范&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-d4cfe78c_b.jpg& data-rawwidth=&2010& data-rawheight=&1342& class=&origin_image zh-lightbox-thumb& width=&2010& data-original=&https://pic1.zhimg.com/50/v2-d4cfe78c_r.jpg&&&/figure&&p&1. 如果有上图所示的&b&持续集成、测试覆盖率、代码质量&/b&等等,那自然是好感满满。它可以表明这是不是一个贴近社区水平的开源项目&/p&&p&2. README 里要&b&清楚&/b&写明项目是怎么用的——它可以表明,候选人的表明能力。&/p&&br&&h2&&b&项目结构&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/50/v2-40ed3caea6958cbec334863_b.jpg& data-rawwidth=&2010& data-rawheight=&1478& class=&origin_image zh-lightbox-thumb& width=&2010& data-original=&https://pic1.zhimg.com/50/v2-40ed3caea6958cbec334863_r.jpg&&&/figure&&p&表明了候选人对代码的组织能力。其他的,以前端项目为例:&/p&&p&1.
package.json 一般来说是必须的~&/p&&p&2. .gitignore、.npmignore 表明了它了解相关实践&/p&&br&&figure&&img src=&https://pic3.zhimg.com/50/v2-66cdba48ecf9df6bfb1ae9_b.jpg& data-rawwidth=&2050& data-rawheight=&1440& class=&origin_image zh-lightbox-thumb& width=&2050& data-original=&https://pic3.zhimg.com/50/v2-66cdba48ecf9df6bfb1ae9_r.jpg&&&/figure&&p&提交信息可以看出候选人的表达能力及工程经验。&/p&&p&而诸如, issues 和
pr 的处理表明候选人的协作能力。&/p&&br&&p&最后一步,便是看代码了。可惜,只是少数项目能走到这一步。&/p&&p&看代码一般会先看测试用例——作为开源项目,应该都是要有测试的。&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-a6a0ab79c6_b.jpg& data-rawwidth=&2036& data-rawheight=&1298& class=&origin_image zh-lightbox-thumb& width=&2036& data-original=&https://pic4.zhimg.com/50/v2-a6a0ab79c6_r.jpg&&&/figure&&br&&p&随后,才是代码本身~~。&/p&
作为 GitHub 中国区首席 markdown 工程师,我们公司的 HR 经常找我来鉴定的。 从首页来看,我只关心三部分: 1. 活跃时间。如果是在最近三个月,才在 GitHub上活跃的,那么这肯定是为了找工作做准备的。2. star 数代表了受欢迎程度。star 数并不能代表候选…
谢邀~~&br&&br&我是来安利我写的一系列电子书的~~。自然是《全栈增长工程师指南》了——&a href=&//link.zhihu.com/?target=https%3A//github.com/phodal/growth-ebook& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - phodal/growth-ebook: Growth Engineering: The Definitive Guide。全栈增长工程师指南&/a&&br&&br&&p&我们都会学习,但是有时候我们只是不知道应该学习什么而已。这也是其他技术书籍所欠缺的。&b&它可以告诉你,你可以学习什么,然后看什么书。&/b&&/p&&br&&figure&&img src=&https://pic4.zhimg.com/50/c8b878e44b2a8edc26e08ded446ab34f_b.jpg& data-rawwidth=&2060& data-rawheight=&2628& class=&origin_image zh-lightbox-thumb& width=&2060& data-original=&https://pic4.zhimg.com/50/c8b878e44b2a8edc26e08ded446ab34f_r.jpg&&&/figure&每一小节都都是一篇文章,目录:&br&&br&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23growth-%25E5%%25E6%25A0%%25A2%259E%25E9%2595%25BF%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%%258C%%258D%2597& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Growth: 全栈增长工程师指南&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%%25E6%25A0%%25B7%25A5%25E7%25A8%258B%25E5%25B8%%2598%25AF%25E6%259C%25AA%25E6%259D%25A5& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&全栈工程师是未来&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E6%258A%%259C%25AF%25E7%259A%%259D%25A9%25E6%%25E5%258F%25B2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&技术的革新史&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E8%25BD%25AF%25E4%25BB%25B6%25E5%25BC%%258F%%259A%%25A0%25B8%25E5%25BF%%259A%25BE%25E9%25A2%%25B2%259F%25E9%A& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&软件开发的核心难题:沟通&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%25A4%25A7%25E5%2585%25AC%25E5%258F%25B8%25E7%259A%%25B8%%25AE%25B6%25E4%25B8%258E%25E5%25B0%258F%25E5%2585%25AC%25E5%258F%25B8%25E7%259A%%%25E6%25A0%2588& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&大公司的专家与小公司的全栈&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%%25E6%25A0%%25B7%25A5%25E7%25A8%258B%25E5%25B8%%259A%%259C%25AA%25E6%259D%25A5%25E6%%25E6%25A0%2588& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&全栈工程师的未来:无栈&/a&&/li&&/ul&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%259F%25BA%25E7%25A1%%259F%25A5%25E8%25AF%%25AF%2587& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基础知识篇&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%25B7%25A5%25E5%%25E5%258F%25AA%25E6%2598%25AF%25E8%25BE%%258A%25A9& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&工具只是辅助&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23webstorm-%25E8%25BF%%2598%25AF-sublime& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WebStorm 还是 Sublime?&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E8%25AF%25AD%25E8%25A8%%25B9%259F%25E6%2598%25AF%25E4%25B8%%25A7%258D%25E5%25B7%25A5%25E5%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&语言也是一种工具&/a&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E6%258F%%25AB%%E7%258E%%259A%%25B7%25A5%25E5%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&提高效率的工具&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%25BF%25AB%25E9%E5%2590%25AF%25E5%258A%25A8%25E8%25BD%25AF%25E4%25BB%25B6& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&快速启动软件&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23ide& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&IDE&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23debug-%25E5%25B7%25A5%25E5%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DEBUG 工具&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E7%25BB%%25AB%25AF%25E6%E5%2591%25BD%25E4%25BB%25A4%25E6%258F%%25A4%25BA%25E7%25AC%25A6& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&终端或命令提示符&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%258C%%25AE%25A1%25E7%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&包管理&/a&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E7%258E%25AF%25E5%25A2%%2590%25AD%25E5%25BB%25BA& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&环境搭建&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23os-x& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OS X&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23windows& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Windows&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23gnulinux& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GNU/Linux&/a&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%25AD%25A6%25E5%25A5%25BD%25E4%25B8%%%25E8%25AF%25AD%25E8%25A8%%259A%%2589%25BA%25E6%259C%25AF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&学好一门语言的艺术&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E4%25B8%%25AC%25A1%25E8%25AF%25AD%25E8%25A8%%25AD%25A6%25E4%25B9%25A0%25E4%25BD%%25AA%258C& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&一次语言学习体验&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E8%25BE%%2587%25BA%25E6%2598%25AF%25E6%259C%%25A5%25BD%25E7%259A%%25BE%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&输出是最好的输入&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%25A6%%25BD%%25BA%%%25E4%25B8%%%25E6%%25E7%259A%%258A%%259C%25AF& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何应用一门新的技术&/a&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23web-%25E7%25BC%%25A8%258B%25E5%259F%25BA%25E7%25A1%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Web 编程基础&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E4%25BB%258E%25E6%25B5%258F%25E8%25A7%%%25E5%%25E6%259C%258D%25E5%258A%25A1%25E5%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从浏览器到服务器&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E4%25BB%258E-html-%25E5%%25E9%25A1%25B5%25E9%259D%25A2%25E6%2598%25BE%25E7%25A4%25BA& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&从 HTML 到页面显示&/a&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&HTML&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23helloworld& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hello,world&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E4%25B8%25AD%25E6%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文?&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%%25E4%25BB%2596-html-%25E6%25A0%%25AE%25B0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&其他 HTML 标记&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%25B0%258F%25E7%25BB%2593-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&小结&/a&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23css& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSS&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E7%25AE%%25BB%258B& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&简介&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E6%25A0%25B7%25E5%25BC%258F%25E4%25B8%258E%25E7%259B%25AE%25E6%25A0%2587& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&样式与目标&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E9%E6%258B%25A9%25E5%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&选择器&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E6%259B%25B4%25E6%259C%%25B6%25A3%25E7%259A%2584-css& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&更有趣的 CSS&/a&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23javascript& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23helloworld-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hello,world&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23javascriptful& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScriptFul&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E9%259D%25A2%25E5%E5%25AF%25B9%25E8%25B1%25A1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&面向对象&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%%25E4%25BB%2596& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&其他&/a&&/li&&/ul&&/li&&/ul&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%E7%25AB%25AF%25E4%25B8%258E%25E5%E5%258F%25B0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&前端与后台&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23%25E5%E5%258F%25B0%25E8%25AF%25AD%25E8%25A8%%E6%258B%25A9& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&后台语言选择&/a&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23javascript-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23python& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//growth.phodal.com/%23java& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&

我要回帖

更多关于 大一高等数学视频教程 的文章

 

随机推荐