项目经理修炼手册 2.1.1 程序员的基本功
2.1 项目经理的来源
首先,你要清楚项目经理的基本来源,通常情况下,项目经理有两种基本来源:
一种是从公司内部提拔上来的。通常我们认为一般一个公司里的技术人员干了3到5年,对公司内部的流程比较熟悉,而且技术过硬能力出色,就有可能被提拔成为项目经理。
另外一种情况是空降而来的,一个人也许在一个公司内没有做过项目管理,但是通过朋友推荐外带编造美好的简历也有可能空降到其他公司当项目经理。一夜之间完成这个从小兵到项目经理的变化。
不过在资讯发达的今天,后者成功的机会已经开始微乎其微,所以要想成为一个项目经理,首当其冲的是要在自己公司内做得出色,得到提拔。但是究竟怎么做才算出色呢,让我给大家一一道来。
2.1.1 程序员的基本功
首先一点是要有良好的计算机软件基础素质,什么是基础素质呢,我在下面给出一个说明。
现在的很多朋友大学刚刚毕业的时候为了应对找工作的压力,在网上看了些最新最酷的技术,然后自己找了一台机器实践了两三下,也能做出一些个人网站或者应用软件,于是就欣欣然起来,自我感觉很良好,这种心态其实是可以理解的。毕竟现在微软的开发工具已经变得非常人性化,开发应用软件也从原来的大量堆砌代码成为了现在的拖拖拽拽控件,这些工具容易易学易用,不需要怎么特别的努力,甚至不需要了解一些概念就可以成为快速开发人员了。
然而在这里我必须遗憾的告诉这些朋友,你拖拖拽拽弄出来的那个东西可能挺好看,也可能挺好玩,但是那个不能算做开发软件,只能算是简单的部署软件,这两者的区别有多大呢?举例来说,你喜欢踢足球,在适龄的同学中跑得快,算是身体素质不错的同学,于是每次在同学一起踢球的时候,你都会表现的非常抢眼,没准在学校踢比赛的时候还招惹了很多女同学的关注,但是请注意,你没有接受过专业的训练,一旦遇到职业体校的同学肯定会被踢得一败涂地。我举这个例子是有亲身体会的,我上学的时候就属于身高体壮一类,在球场上身体对抗很占优势,在学校里小有名气,由于司职后卫被冠以“小范志毅”的绰号,但是当我参加北京市级别的青少年足球联赛的时候,队友中有一个当时还没踢上职业联赛但是在体校训练的瘦瘦的青年,此人绰号“终点站”叫做薛申(喜欢足球的朋友可能知道,薛申后来成为了北京国安队的职业球员,再后来转会深圳,其人以脚法秀丽见长,但是身体单薄,对抗能力较差),但是薛申之所以叫做终点站,是因为一旦足球到了他的脚下,他就会凭借着熟练的盘带突破所有对手,把球送进对方的球网,在我们看来他简直是神乎其技,更不可思议的是当时我体重90公斤,他体重不到70公斤,但是每次身体对抗,我都会被顶到一边,这事我百思不得其解,后来问薛申,薛申告诉我说,身体对抗并不是比赛体重,而是比赛肌肉强度和韧性,这方面没有受过专业训练的人是无法和职业选手对抗的。
我讲这个故事其实是想告诉各位,在开发工具如此方便快捷的今天,能写一个小程序就像当年我踢足球一样,其实并不是什么难事,但是想靠写程序吃饭,就必须想薛申那样,经过严格的基本训练,程序员的基本功训练就是三个部分.
第一是熟悉计算机基础原理,了解CPU的工作方式,基本指令、寄存器、数据总线等等基本概念,只要了解了计算机的基本运行方式,无论以后你使用何种高级的开发语言和工具,你都能做到游刃有余。在这里我推荐阅读《深入理解计算机系统》这本书,从程序员的视角,看计算机系统!
本书适用于那些想要写出更快、更可靠程序的程序员。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统和网络互连环境。而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互连做好准备。
本书的主要论题包括:数据表示、C程序的机器级表示、处理器结构,程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、网络编程和并发编程。书中所覆盖的内容主要是这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书说明了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的。在讨论网络互连时,本书描述了并发服务器如何能有效地处理来自多个客户端的请求。
本书基于Intel兼容(IA32)机器,在Unix或者相关的操作系统(例如,Linux)上执行C程序。虽然书中包括了一些帮助读者将Java转化成C的提示,但是还是要求读者对C或者C++有一定的了解。
您可以通过本书的Web网站www.csapp.cs.cmu.edu获得完整的资料,包括实验和作业,授课笔记和代码示例。
本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,著名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作。作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。
本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户应用。
本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。
第二门基本功课就是数据结构和算法,这两门功课是程序开发的灵魂,如果不了解数据结构和算法基本上开发出一个好的应用程序是不太可能的,目前这两门功课也在被不断忽视,原因是各种应用语言的类库中都封装了对各种存储结构的基本操作,这样一来,广大开发者不再需要了解存储结构即可对各种数据结构进行使用了,但是这样的弊端就是,不明真相的开发者就会调用一种结构,而且偏执的执着于在各种情况下使用这种存储结构,我认识很多初学的朋友都有这种偏执。原因是他们不知道别的算法和存储结构,又或者不能理解使用别种算法的优劣或者别种数据结构的好处。
这其中,数据结构又是算法的基础,没有数据结构的概念则根本无法理解各种。所以掌握好数据结构是很重要的。
清华大学严蔚敏教授的《数据结构》算是这门功课里比较值得一读的书,因为是用中文写成,且配有习题集,所以很容易被大学掌握。本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。
当然,这本书也不是全无问题,主要是本书对C语言过于依赖,需要读者在阅读之前由较强的C语言基础。
算法的书籍较多,比较经典的有《编程珠玑》本书针对程序设计人员探讨了一系列的实际问题,这些问题是对现实中常见问题的归纳总结。作者虽然没有给出解决这些问题的具体代码,但始终非常富有洞察力和创造力地围绕着这些折磨程序员的实际问题展开讨论,从而引导读者理解问题并学会解决问题的技能,这些都是程序员实际编程生涯中的基本技能。为此,本书给出了一些精心设计的有趣而且颇具指导意义的程序,这些程序能够为那些复杂的编程问题提供清晰而且完备的解决思路,书中还充满了对实用程序设计技巧及基本设计原则的清晰而睿智的描述。
算法和数据存储结构的基本功是一个好程序员和一个爱好者的本质区别,掌握好了这两门学问,才可以算是在计算机行业具有入门的本领了。
第三个基本技术需求就是架构设计,很多程序员对这方面可能缺乏概念,刚刚入门的程序员对编码技术的理解可能还不能达到设计模式所提及的高度,对那些似乎是“脱了裤子放屁”的绕弯子做法不屑一顾,在这里我推荐大家做几个工作。首先有空的时候看看那些成名已久的程序员写的书,比如《编程匠艺》,比如《代码天书》,这些书都是那些经历过无数成功和失败的,老腕一生经验的总结,其内容可以说是字字血泪,所有内容都并非凭空而来,阅读这些书可以帮助读者建立一个良好的编码习惯,这对一个业余选手成为正规军尤为重要。其次就是要找一个或几个开源项目进行重点代码阅读,开源项目,尤其是大企业的开源项目,绝对是软件编码技术和工程管理的精品,所具有的特质很值得大家学习。最后就是分享与交流,闭门造车是信息时代绝对无法想象的事情,要想在技术上有所掌获,那么不断的参与交流,在提出观点->遇到挑战->修订观点的循环中螺旋式上升,是一个开发人员快速成长的最好方式。