程序员生存定律这系列的目录在这里:程序员生存定律--目录html
喜欢从头瞄的,能够移步。程序员
------------------------------------------------------------------------------正则表达式
从大环境来看,想不写程序直接去作管理工做是很难的。大多时候都要在开发上作出必定成绩,接下来才有选择技术仍是管理的机会。所以即便是但愿选择管理方向,技术上的基本功仍是须要的。因此下面这节的内容和选择作管理方向仍是技术方向关联不大,只要是想作程序员,大体上都有必要一读。算法
大学里常常会开设软件工程专业,在这门课程里面大多时候会讲解需求工程、开发模型、设计方法、项目管理等。但不少同窗会感受这课程让人摸不着头脑,认真学也学不到什么。从这种广泛现象能够发掘出一些本质问题。数据库
这里的本质问题是指软件开发是实践性很是强的科目,所以不适合先从概念开始。这不意味着软件工程、设计思想不重要,而只是说不适合从纯粹的概念开始学习编程。 编程
在软件这个行业里,不少比较资深的人员对如何学习编程是有统一认识的:学一点,实践一点,再学一点,再实践一点。但困难的是每一个人对每次迭代的“一点”到底是多少认知不一样,对“一点”是什么的定义也是不一样。设计模式
我我的的观点是以3000代码行为界算第一个一点,也就是说一我的学会某个语言后小练习不算,先完成一个3000代码行左右的,没有UI的独立程序。为解释什么叫独立的程序,举一个具体的例子。数据结构
在《敏捷软件开发:原则、模式和实践》一书中有一个薪水支付的例子程序,正好是这个规模,很适合帮助达成这一目的。这个程序的基本规格说明是:架构
(下文引自《敏捷软件开发:原则,模式与实践》)框架
在学完编程语言、面向对象、UML以后能够先参照这份规格说明,什么例子程序都不看,本身完整的作一份实现,实现中要包含UML图和代码,接下来能够去把Robert C.Martin的例子程序下载回来,同本身的实如今设计上和实现细节上作详细的比较,找出那点本身好,那点Robert C.Martin的好。这样对编程语言、对面向对象、对设计原则就能够有比较踏实的一些理解。此外,这个程序的一个额外的好处是它能够彻底独立于平台,只依赖于语言和标准库便可。
假设说一个新手已经熟练掌握了一门语言,那么完成上述的任务估计须要2~4人周,固然有经验的人1我的周左右已经足够了。
在此以后,能够精读一个上点规模的(1~5万行最佳)独立性比较强的应用程序,因为已经上了规模,作到彻底的与平台相隔离就有点难了,无法提供统一的例子做参考。但选择标准主要有两个,一个是尽量和本身将来指望的方向相吻合,一个是尽量比较独立和经典。独立的目的是方便调试,经典的目的是确保代码质量。好比:若是是Windows本地应用就能够考虑Notepad++类的开源应用,Web应用就能够考虑WordPress等。这个时间点上须要避免好高骛远,Linux内核与Chrome固然很好,但它们并不适合初学者的。
在精读过程当中可能须要几类书籍:一是平台框架相关的(线程机制等),一类是模式相关的,一类是工具型的书(如何调试)。这个时候是要耐下心来读几本比较经典的书的。
精读以后,就要再找到一个项目来实践。这里的关键是真的项目,至少要有真的用户,而且用户数目越多越好。最好是可以向知名开源项目提交代码。
各类基础知识中比较例外的是计算机体系结构、数据结构和算法这类理论性比较强的东西,这种学习曲线比较陡的东西须要结合大学的课程把它学会,接下来再在实践中逐渐应用,而不能一边作事一边学习。缘由是学习曲线越陡的东西越须要大块时间,毕业以后再学效率会差。
总的来看,上述几个步骤,应该在大学毕业后2~3年内完成,最好在大学里完成,这样可能会有点优点。这些完成以后,打基础阶段能够算是基本结束。
有不少不一样的方法能够学会编程,好比说:一我的既能够先打牢基础,接下来再逐步学会如何进行各类开发工做;也能够无论三七二十一,先借助各类IDE把程序作出来再说。上一节主要介绍的是先打根基的方法,而不是速成的方法。
相对于打根基的方法,后一种学习方法更容易在短期内看到效果,因此不少人都是这么入的行,好比:先从IDE开始,接下来再从表面往本质去学,逐步去了解控件拖放背后所隐含的东西。这不能说彻底很差,但我认为这是一种失足,几乎必定会催生程序员只能吃青春饭的结果。
在刚开始编程的时候,若是造成对IDE的过分依赖,那就会致使根基浅薄,能作的事极可能被限制在某个有限的范围内。当下的大多IDE功能已经很是强劲,这对提升产品的生产率无疑是很是有必要的,但在学习阶段,则要尽量避免过分依赖于IDE,避免用各类控件来快速完成任务。
好比说:微软在Visual Studio 2012里面内置了一种名为LightSwitch的技术,基于这项技术,一我的能够在基本不编码的状况下,完成信息系统的开发,并支持相对比较丰富的功能(增删改查,搜索,排序等)。无疑的基于这样的工具作开发速度会快上不少,但在学习阶段过分使用这类工具,却会毁了一我的的根基。
想象一下,在使用LightSwitch的过程当中一我的会学到什么?他所能学到的主要是这种工具的使用方法,既不会学到SQL语句,也不会学到数据库表格的设计方法,也不会学到ASP.net的基本架构(虽然ASP.net已经封装了很是多的东西)。这样一来,这我的虽然可以快速的完成某个工做,但却给本身埋下了很深的隐患---他很容易的被束缚于某个工具,而且没法应对新领域。
善用IDE集成好的功能进行快速开发不是学习阶段应该作的事情,学习阶段最根本的目的是打基础,把一门语言学精,把一种设计思想学精,把一种算法学精等等,这种基础可能不直接表现为生产力,即便把算法学精了,可能仍是没法马上写出来比较炫的程序,但这有助于面对不停变化的世界,这与单纯的达成某个目的,完成某个程序不一样。这能够类比为打地基与盖楼,地基部分显然不能单独进行销售,也不能住人,但没有地基也就没有其上几十层能够高价售出的住宅,楼越高,地基也就越深。固然,只盖地基或者让五层楼和五十层楼使用同样的地基也不必,这不用多说。
那具体来说,那些东西能够被认为是编程的根基,须要在学习阶段扎实的掌握?下面将经过推荐几本书(或者说几类书)来描述一个共通于全部程序员的最小集合。
这一类别下最具表明性的书籍是《深刻理解计算机系统》,做者是Randal E.Bryant和David O’Hallaron。读这本书的目的是了解计算机究竟是怎么个东西,软件到底运行在什么样的基础之上。
这一类别下最具表明性的书籍是《算法导论》,做者是Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford Stein。读这本书的目的是了解软件到底能够用什么样的手段干些什么事情。软件是一种工具,能够帮助解决人类面临的许多问题,而主要手段则只有两种,一种是这本书里所介绍的算法和数据结构;另外一种则是下一类别中所涉及到的分析和设计方法。它们像小刀子同样,能够把各类领域中的各类问题进行分割,并映射到程序的世界里来。
这一类别中比较有表明性的书籍是《敏捷软件开发:原则、模式与实践》,做者是Robert C.Martin。读这本书的目的是了解数据结构和算法以外另外一种对现实问题进行抽象的方法如面向对象以及进行这种抽象时所要遵照的原则。
这类书籍经典的还有不少好比:GoF的《设计模式》,而之因此选择上述这本是由于这本书里提供一些比较完整的例子,更适合初学者一些。
这一类别中最具表明性的书籍是《代码大全》,做者是Steve McConnell。读这本书的目的是创建对软件开发的全局视图。知道一个软件从无到有所要经历的一系列过程。
软工的书还有不少,好比颇有名的《人月神话》,但《人月神话》类书其实对不少人是不适合的,对初学者就更不适合。
上面四本书是一个最小集合,针对不一样场景须要进行不一样的增长,好比可能须要进一步了解某种框架的机制,那就须要读《XX技术内幕》这类书。但即便是读这几本书也不适合只读书而不动手,最好是穿插在上一节中提到的实践中来读,不然的话对后两本的理解会有所欠缺。
若是想走厚积薄发这条路的上面几本书是必定要预先读通的。阅读过程当中,若是发现有些细节问题完全没法理解,那就要在实践过程当中进一步琢磨,找到本身的答案。读这类书时,有一件事情必定要有心理准备:虽然这些书读通并不容易,很花时间,但想读了这些书后马上写出来一个能卖点钱的工具是不太可能的,这真和大楼的地基同样,没什么立竿见影的效果。若是想尽快达成后者这样的目的,那极可能就要走速成的道路,去读些介绍IDE怎么用,某个框架怎么用的书,好比:《C#高级编程》这类。
为避免误解,有一点须要额外进行一点说明。前面强调的避免过分IDE依赖主要是指不要用封装良好的模块来取代对基础知识的学习,不是说不须要创建本身的工具箱。查找工具、调试工具(进程线程查看等)、二进制数据查看工具、正则表达式工具、持续集成工具、文档生成工具(JavaDoc)、正则表达式工具等对一个程序员的生产力是很是有帮助的,应该在学习过程当中逐个掌握。软件开发工做发展到如今,任何一个类别下面都有至关多的比较成熟好用工具了,关键是选定一个把它用熟。
------------------------------------------------------------------------------
关于我本身的各类信息,在左边栏可找到,想了解下写这系列文章的人是否是骗子和大忽悠的能够瞄。
最后但愿感兴趣的支持V众投,感受上这应该是国内最靠谱的生活购物等的问答社区了吧,都是朋友给朋友作的答案,同时实行一人一号,一人一票制度,想找什么答案关注公众号:vzhongtou(左侧有二维码)就好了。