书中作者从四个维度,即自己可以控制的变量对程序员的生存定律进行阐释和说明。它们分别是:自身的价值—自己能干什么?自身价值上的表达力—别人认为你能干什么?自身的稀缺*—市场对自身掌握技术的需求程度?所处公司的平台—公司平台能给自己提供什么样学习、展示机会?
在程序员的职业发展道路中,最好要使努力和规律相吻合,并且在挣得选择权的时候做出正确的选择,才能使人生的效能最大化;
要想挣得选择权并且避免误用,就要对程序世界蕴含的规律洞若观火。首先要知道程序员人生的出口有哪些;影响这些出口的职场定律是什么;在职场定律中哪些是预设前提;哪些是可控变量;其中可控变量是自己可以通过努力改变的,所以对自身而言,可控变量是挣得选择权,并且避免选择权被误用的关键;
程序员的人生出口:
程序员的出口通常有五种:提前退场、维持现状的老码农、转向管理层、成为超一流的高手、积累爆发创业;
影响人失出口的因素有很多:机缘、天分、努力。机缘、天分皆为命数使我们不能改变的,我们能改变的、打破既定命数的砝码只有努力。上帝是公平的,分给每个人的时间是一样的,不一样的只是人通过努力实现的效能不同而已。
努力本身不是单纯的付出,还包括方向的选择、对形式的顺应、对环境的驾驭。不考虑这些因素的努力,往往会努力但颗粒无收。
职场生存定律:
前提:交换是职场生存的根本;交换的两端分别为:自身能创造的价值与自己的职位(包含收入的等);最终决定交换价值的是主要有两个因素:内含价值与市场因素(稀缺*等)。
0.生存定律总纲:假设一个人的技能所带来的价值为s,实现程度为a,那么s*a即为一个人可为公司创造的可见价值,也就是可以从公司交换到的最大价值;影响a的因素主要有:自身价值的表达力、自身价值的稀缺*、公司的特质和未来。
1.自身的价值;
人创造价值的基本途径有两个:一个是完全依赖自身技能,另一个则是假于他人之手。
自身价值的实现过程中注意两点:一个是如果想走技术路线,就走以技术为核心支撑的公司;如果想走管理就不要去纯开发环境中。二是无论走那条路线都要努力走到专业和高端;
2.自身的表达力;
表达力不仅仅是语言层面的东西,过往的经历、举止、*格、习惯等都是表达力的一部分。
适当推销自己、赞扬别人、适当的从众、搞好人际关系这类印象管理的手段来管理个人表现面也是一种不错的方式。
3.自身的价值的稀缺*;
稀缺*是一种大势,作为个人几乎不能改变,只能做选择以对应将来,在特定的时间点,做出恰当判断的问题;
稀缺*是有时效*的。
4.所处公司的特质和未来:
法律面前公司与公司是平等的,但是实际上公司和公司上的差异可能比人与猴子的差距还要大;
总结:我们可以把这个定律和种种要素当做镜子来用,看自己过去的失误、现在的短板、未来的道路。
软件的世界是什么样子的:
1.介入门槛低;
避免使自己陷入只做应用级的开发被后来者淘汰的命运。
2.技术更新快;
很多传统行业的技能往往依赖于自然规律,软件行业所需的东西往往依赖于某个组织或者公司。
数据结构和算法算是比较长效的东西。
越抽象、越偏向研究的东西其价值越长久,越具体、越立即可用的东西其时效*越强;
3.同样是软件,但是,软件与软件的差距很大;
对个人发展而言,要关注知识的可流动*这类问题。学习必须聚焦。
对方法论而言,任何一种方法不仅要陈述自己的方法,还要陈述自己方法的使用边界。
总结:软件行业中的特征还有很多,但和程序员关联比较大且无法改变的主要有上述三种。这三者类似于全局变量、而程序员自身的努力相当于局部变量,它们共同在生存定律下起作用,影响人生的最终高度。
程序员的增值之路:
对程序员而言,最根本的是提升自身的价值,忽略提升自己而单纯的沉溺于成功学、方法论这些东西,自己早晚会吃苦果子。
增值之路将从三方面来讲:如何选定自己的方向、如何开始自己的学习、如何持续进阶成为高手。
1.方向的选择:技术还是管理
1.1技术和管理的差别:
一旦走上管理岗位,那么就会和ppt打交道的时间越来越长。虽然也会关注技术的最新动向,但是不会再去关注技术的实现细节了。
管理和技术的工作有本质的区别:管理是和人打交道,就意味着处理事情的时间被碎片化了,处理的事情更加琐碎了,被打断的概率大大增加,不能专注的去写代码了,而写代码是需要专注的。
1.2技术路径长短对前途的影响:
当一个公司的核心技术并没有创造太大的价值,而是靠人力规模、商业模式来支持业务的时候,那么我们可以称之为技术路径短的公司。
单纯在既定接口下实现已经定义的业务逻辑就是技术路径比较短的工作,是体力密集型的。而分析业务逻辑,控制整体架构或者去研究tts算法则是智力密集型的,技术路径较长。
在选择方向上,要避免选择了技术却去技术路径比较短的公司,选择了管理却在纯技术流的公司。
1.3什么样的程序员适合转管理
外倾型(喜欢群居,善于社交和自我决断)和经验开放*(富有创造*,凡是好奇,具有艺术的敏感*。反之,则保守对熟悉的食物感到舒适和满足)。
1.4管理工作的负效应
通纯技术相比,管理工作的(特别是中层管理)的可流动*可能会非常低。
2.增值之路的起点:
2.1从哪里开始编程生涯:
软件开发是实践*非常强的科目,最好的学习方式是:学一点、实践一点、再学习一点、再实践一点。
自己*做一个3000行左右的*程序,实现中包含uml图和代码。
精读一个上点规模的(1到5万行最佳)**比较强的应用程序。选择标准有两个:一个是尽可能和自己未来期望的方向相吻合,二是尽可能比较*和经典;精读过程中可能需要几类书籍:平台框架相关(线程机制)、模式相关、工具型的书籍(如何调试)。
精读之后,再找一个项目实践,最好能想知名开源项目提交代码;
各种基础知识中比较例外的是的计算机体系结构、数据结构和算法这类理论*比较强的东西,这种学习曲线比较陡的东西需要结合大学课程把它学会,接下来在实践中逐渐应用,而不能一边做事学习。原因是学习曲线比较陡的东西需要大块时间,毕业之后在学习会效率会比较低。
2.2打牢根基vs速成之路
如果形成对ide的过度依赖,会导致根基薄弱,做事情被限制在某个有限的范围内,无法应对新领域。
打牢编程根基需要读的书籍:计算机体系结构《深入理解计算机系统》,算法和数据结构《算法导论》,设计原则和模式《敏捷软件开发:原则、模式和实践》、gof《设计模式》,软件工程《代码大全》、《人月神话》。读的工程中穿插实践。
如果非要速成,死磕一种流行的开源程序。
2.3掌握读代码的方法和技巧
读代码这事,要先分为精读还是泛读。
从学习的目的来看,一定要精读一定量的经典代码,而精读是指每行都能读懂,而不看代码就能在脑子里勾勒出程序的基本结构。判断标准:满脑子都是代码,放不下。
泛读较大规模代码的方法:①先把规格说明书弄清楚,对于应用程序要先大致整清楚它的使用方法、使用场景;对应库则弄清楚它对外接口的定义。②把涉及到的专业知识提前搞定。【接下来从大到小,从面到点】③弄清代码的基本静态结构,如:包结构、类构成等,搞清楚每个部分的核心职责。④最常用的典型场景,思考上面静态结构是如何发挥作用的,数据流的变迁。在脑子中生成比较高层次的静态和动态结构图,类似uml中的sequence图和类图。⑤关注进程、线程结构。⑥对自己负责的部分深入挖掘,可以把功能型的模块优先级降低。判断读懂的依据为:单靠纸和笔能能描绘出程序典型场景的sequence图。
读代码的背后有两个基本技巧很重要:①掌握程序里内嵌的log机制,要能看log,必要时候还能加log。②基本调试方法。
2.4从哪门编程语言开始学习
c语言必须学习;
学习阶段学习语言的目的是为了掌握编程的基本概念并为了更快速的掌握另一门编程语言。
总结:
写程序、读程序、学好学习曲线陡的知识、避免ide依赖这些事情的根本目的是为了打好基础。
3.如何顺利的成为高手
3.1高手的定义和养成关键
高手意味着专业,专业是生存和发展最为重要的一个前提;在特定领域内,能搞定大部分人搞不定的事情就是高手。
要想成为高手,必须经历:学习、思考、实践、总结、分享的步骤。
成为高手的路上要考虑软件的三个基本特征(技术更迭快、介入门槛低、多内部分野),人的黄金学习时间是毕业后的10年左右的时间。成为高手有三点比较关键:①要有一张全局*的地图,以便选好方向②知道都有那些坑,避免它③要有足够的热情和动力能够持续的坚持下去。
3.2全局*的地图
每个人根据自己的情形建立一张分类的知识地图,然后按照地图选择一条自己的路线,持续积累,寻找实践机会。进阶方向:①由程序员而架构师②由程序员而codeguru(捷径:找一个应用广,有深度的开源项目,参与进去)③由程序员而管理。
要有产品的视角。
3.3避免增值路上常见的“坑”
①学习失去焦点。一旦误读了知识和目的间的因果关系,就会造成学习失焦,进而造成负效应,毕竟相对人的而言,世界上的知识不是太少,而是太多。一般认识是只要学习就必有所得,对人生的的影响一定是正面的,然而在软件行业里面,这种想法不太正确,因为软件的更迭速度快,子领域众多的特质使得软件相关的知识是**增长的。避免失去焦点,最有效的的方式是分类,清楚自己的目标,对软件开发进行分类,对软件所关联的知识进行分类,形成自己的大局观和整体视图。
②学习与实践相分离。很多人自学的东西和工作中用的东西完全没有关系,这是很低效的。软件是一种固化思维,软件开发更多是一种实践而非理论。软件开发内,很多领域,总体上看体现的是复杂而不是艰难,不论是前端开发还是驱动开发。软件开发的学习过程中,实践很重要,纯理论知识的权重较低,当然基本的算法复杂度,还是要明白的。能做和做好之间的鸿沟需要大量的实践来填平。最好的方式是以当前参加的项目为根基展开学习,这样才能比较好的调和学习和实践。
③“博”与“专”上面的迷失
可以分两次迭代:第1次,达到两个基本目标。第一个目标是为产品贡献自己力量,但代码质量一般。(比如:了解某了语音、平台、ide、业务相关的知识。用到的则要学透,不管接触到哪个框架,都要了解它的内存机制、线程机制、异常处理组件构建和*化处理这些全局*的机制)第二个目标把事情做好,并能负担起层次更高的工作。(比较深入的了解面向对象,结构化方法,设计模式,理解设计原则)。第2次有两个方向可以选择。考虑专的问题(在特定领域里把知识深化下去,警惕边界效应);考虑博的问题(熟悉专门领域的专业知识、即存框架下的特*、提高用户体验的关键点)。选择的总的原则是以当下工作为根基,以实用为目的甄选各种知识,并追求平衡点。
④错过人生中的好时机
40岁左右,一个人达到人生的顶点,学习要顺应自然规律,基本上讲35岁之前学习
比较硬、学习曲线比较陡的技能以及工作中所需要的主要技能。35岁以后主要关心知识的更新和软技能。学习硬技能要投入大块时间,集中精力,一次完成。比较硬的技能列表(精通一门最常用的语言、了解最常用平台的基本机制(内存管理、线程)、uml图和面向对象分析设计方法、设计原则、设计模式、《代码大全》里讲的一切、精读一个有点规模的开源程序、累积一定的代码量(*完整的做过一个数万行的东西)、掌握基本算法和数据结构、养成清晰的编码风格、有自己的专业(金融、高并发网站、图像处理、tts等))。
⑤停止知识的更新
判断自己是否停止知识更新的标准是:一年一本书没看、一年一点新知识没有接触、一年中工作负荷基本不满。
3.4给自己找一个驱动力
必须要有所执着,持续的运用你的脑力、体力去做某件事情。
①纯物质上的驱动力。②兴趣的力量。③使人生永动的势能。人的思维和欲望具有无边界特质,只有在未来和现实之间制造一种差距,那么就会产生无尽的势能,人也就会不断前行。物质需要、成就渴望、不安全感的驱离、技术上的追求都可以使自己的势能。
总结:
驱动力(让自己的人生有归属感,有一种持续的驱动力)、明确方向(guru,架构师还是管理者)、全局视图(对名目繁多的各种知识进行分类)、提高效能(避开学习和实践相分离这种降低效能的增值方式)。
自身的表达力磨砺:
0.表达力的类别和作用:
不同公司间不同的是对表达力的需求程度,而不是表达力是否有其存在价值。
表达力和技术技能不是一种对立关系,而是一种叠加关系。
表达力并非仅限于语言,现实亦可作为表达力的佐证,但凡影响一个人在组织、他人的形象的东西都可以视为表达力。表达力是言行合一后的力量。
1.改善表达力的途径:
1.1使自己有资历;
资历本身并不能增加一个人的能力,但是它可以增加一个人左右的力量,影响个人力量的表达。资历之中包含了三方面的力量:忠诚、信任、对既有规则和人员的熟悉。
结论:资历有助于提升个人能力,所以要给自己一点资历,在彻底没有希望的时候换工作。只有在自身价值无法增长且自己不愿意混日子的时候换工作。不要低估资历的影响而频繁换工作,换工作是可以的,但想通过频繁换工作而提高获取较高职位的几率是缘木求鱼。人这一生,跟对人是非常重要的。
1.2.克服*格和习惯中的致命缺点;
①人情练达。与人合作,从他人那里获得更多支持并取得成绩这一事需要人情练达。几条传统的智慧:欠别人的要记清楚,别人欠自己的可以含糊;要言而有信;不要为无所谓的事情的争吵,乃至恶言;不要通过别人来*自己;不要恶意欺骗他人。②有条件的顺应环境。天下没有完美的公司:很多人聚集在一起的地方几乎必然是名利场,名利场中几乎一定有不堪的地方。知道哪类事情必须顺应:最不应该顺应的东西主要有两个:一个是公司中处处显失公平,一是个人在公司完全看不到发挥的机会和未来。从长期视角来看,主动去做,错了也是对的
,被动做事,对了也是错的。③去除致命的坏习惯:一是忽视细节,这会导致别人认为你不具备做事的能力;二是负不起责任,这会导致别人认为你不用心做事。
2.善用借势:
①借势的价值:取他人、他物为我所用,始终有着不可忽略的价值。借势的一个小技巧:很多时候糊涂一点、包容一点,如果心思太细,眼睛太亮,那就很容易与所有人疏离。②借势的具体方法:天时(公司的发展时期)。地理(公司的地理位置)。人和层面的借势,直接接触人群中的借势and社交媒体中的借势。技术上的借势。
3.了解一点“*”;
①程序员离不开“*”,如果想往管理方向发展,那么基本躲不开,如果想往技术方向发展,那么依赖于公司的传统。②可参考的*手段:印象管理—诚实的宣传自己,获得更多的认可。常见的权术手段:合法*—强调自己的请求和组织的政策规则一致;理*说服—通过逻辑论证和事实依据来说明请求的合法*;鼓舞式诉说—通过所选人物的价值观、需求等来开发情绪承诺;商议—通过让他人参与决策如何执行计划和变革来提高对目标的激励、获得更多的支持;交换—通过奖励目标人物一定的利益和好处来交换接下来的请求。个人式诉求—使用友谊或忠诚获得同意;逢迎—提出请求前,先吹捧、赞扬或使用友好的行为。施压—通过警告和威胁,反复重复你的要求;联盟;③检查自己的表达力:自己换工作的频度是不是太高了?自己是不是一个惹人厌烦的人?自己有没有一点影响力?
总结:
我们对表达力进行了重定义,把它定义为资历、*格、借势、*应对综合后所表现出来的一种力量,而不是单纯的言语表达。
自身的价值的稀缺*:
改善自己的稀缺*,通常需要同时做两方面的工作:一是提升自己,一是顺应时势。
1.奔向价值高地:(1)拓宽自己横向的面(编程语言,业务逻辑,外语,网络知识等等)(2)成为专家型人才;注意关注的不是技术本身,而是是否能完整的做成一件与商业价值联系比较紧密的事情;考虑学习知识的可流动*;
2.走在技术潮流前面或者里面:基于现实拥抱学习新技术,基于现实要考虑到技术的实际价值,以及技术的学习实践不可分离特*;新技术要以知识块为单位;
3.检验自己的稀缺*有两种方式:方式一:如果一个毕业生做这件事情的话,多久能做好?方式二:自己掌握的技术是否即将过时?(为保持对技术动向的敏感度,定期阅读别人的架构非常重要)自己掌握的技术还有多少人同样掌握?(单纯的会使用某种语言某种框架,稀缺*一定没有。但对数据库的设计有相当程度的掌握,能够较好的通过负载均衡、缓存等手段保证系统的*能才算有一定的稀缺*)。
4.总结:从技术角度看,稀缺*就是选定一个技术路径长,不处在衰落期的领域,不停的打磨,不停的前行。在技术大潮中的位置——》技术上的高度——》稀缺*。
程序员的公司选择:
公司提供的岗位决定了你所接触的技术、人物,进一步决定了你的眼界、能力和人脉,也一定程度上决定了你履历的价值。这些都是对一个人至关重要的东西。
1.公司的分类:
地域(地域主要影响可流动范围,一线适合事业,二线适合生活。)、行业(选择主营是软件且子行业在高速发展的公司)、分工所处的位置(尽可能考虑上游的公司,因为这种分工上的位置对成长和收入都会有比较大的影响)、时间轴(发展期,成熟期,衰落期。避免衰落期,尽可能选择成熟期。)、核心竞争力(选择有核心竞争力,技术导向的公司)、公司文化;
外包行业:(从好到差排序)知名的*软件开发商、前景比较好的*软件供应商、高端外包业务的公司、低端外包业务的公司。
互联网行业:搜索引擎,大数据,社交网络可以认为是互联网,但是挪到互联网上erp也还是erp,不能算互联网行业。
外企:透明天花板(国内企业高于欧美企业,欧美企业高于日韩企业);规范程度(越是本土企业,反倒会差一点)。
受非市场因素影响较大的公司:应该规避这类公司。
2.选择公司的方法:
做选择的过程基本是这样的:先给公司分类并且搞清楚特定公司的利弊得失(看一下公司的核心竞争力和技术路径);考虑自身的状况进行选择(考虑两件事情:工作要和自己的根基契合,要扬长避短;在发展、赚钱、安稳和兴趣之间找到平衡点,兴趣>发展>赚钱>安稳)。
选择知名互联网公司(规避子公司)、技术路径长、主营产品为软件(不是主营软件的公司会碰到的情况:永远要用最简单最直接的技术做基本能用的软件;可能不会被重视,会和周围的人格格不入)的公司;
技术牛人的成长经历感悟:
1.自学能力是竞争之本。
2.自信能让你与众不同,尽管有时的自信有点莫名其妙。
3.兴趣是学习效率的催化剂,培养自己的职业兴趣。
4.学习应给自己设置虚拟的项目目标,以做项目的形式提升学习效果,只有这样学习的内容才会深入而实用,切忌无目标的学到哪里算哪里。
5.话语权首先来自能力,而不是职位权力。
6.难学的技能一旦掌握,更具有竞争优势。
7.用阶段*成果不断增强自己的自信,但最终支持自信的是能力,而不是自大。
8.做自己喜欢的事情,如果那是自己兴趣的话更好。
9.无论身处多么困难的环境,即使觉得前途渺茫,也不要放弃学习,否则就是“自断筋骨”。
10.机遇很重要,但是你得有能力才能抓住它。
11.职场比拼的不是智商,而是坚持和好习惯。
12.当短期利益与长期利益无法兼得的时候,选择长期利益。
13.学历是很重要的敲门砖,即使你得能力很强,学历尽管很重要,但能力才是最终的通行证。
14.技术细节掌握的越深,解决问题是就越能游刃有余。
15.技能的发展应采取深度先于广度且交替进行的方式,只有这样,面对新知识时候,才能更加淡定。
16.越难的技术问题,其背后蕴藏的知识越丰富,越具有学习的价值。
17.每次积累的点滴知识,一定会在将来不知不觉发挥效能。
18.通过文档化的方式传承知识给后继者是你的基本责任。
19.别人对你价值的认可,不仅仅根据你的自身能力,而是根据你对他人和团队的贡献。
20.英语的听说读写,只要有合适的环境,并用于张嘴的练习的情况下能快速的提高。
21.在软件开发活动中,应设法通过有效的技术途径去解决工程困境。
22.不要用沉默的方式一味迎合别人的要求,据理力争或许才是作为的表现。
23.流程、文档的作用,不仅引导我们完事,还规范我们的行为培养我们的习惯。