今天,你算法了没?
关注:九三智能控,每天学点AI算法
0.来源说明
Copyright 2002, 2003, 2016 Robert L. Read
Licensed under Creative Commons Attribution-ShareAlike 4.0 International License.
翻译:梦里风林
原文:
https://github.com/braydie/HowToBeAProgrammer
译文:
https://braydie.gitbooks.io/how-to-be-a-programmer/content/zh/
1.内容提要
程序员、码农、架构师……这些Title已经司空见惯,软件已经无处不在。下一个时代将是“软件定义的时代”,即使是智能技术,也要深度依赖于软件的基础设施和实现手段来发挥作用(当然,涉及到感知设备、算力设备和执行机构部分是需要硬件的,比如机器人、自动驾驶等等)。
九三山人认为,算法工程师的自我修养可以归纳为三大技能:数学、编程,以及算法模型实践。这些咱们已经在《揭开算法工程师的神秘面纱 | 不会coder的数学家不是一个好算法》中清楚的讲过了,不再赘述。
很多初学者或者数据科学家看到编程两个字,可能就已经想要放弃了。千万不要被吓到,程序员其实不过是软件世界里的“工作人员”,只不过他们的产品是代码,他们的生产工具是计算机。这一次,九三奉上这份有关程序员的生存必备教程《how to be a programmer》,在真实的编程工作时所需要了解的所有生存技能与经验。让我们一起来看看作为合格的程序员,在编程(写代码)以外的生存技能都有哪些吧。
“
中英文两版教程全文PDF下载,请在公众号回复:20181006
”
PS:鉴于中文翻译经常出现的词不达意情况,可以参照读一下英文版,顺便提高英文水平哟。
2.前言
对于程序员来说,编程很重要,这需要强大的智力和技能。关于编程本身,讲解的书已经非常之多, 比如The Pragmatic Programmer, Code Complete , Rapid Development, 以及 Extreme Programming Explained都传授编程(知识),并阐述做一个好的程序员这个大话题。
与此同时, 在好的程序员看来,相比构建一个让客户和各种各样的同事都满意的软件系统,(纯粹的)编程真的只是小孩子的玩意。更加重要的实战技能是:
这些可能是在真实的编程工作时必须掌握的所有生存技能与经验。
这份教程真的非常赞!但你没必要一下子读完掌握,相关的问题在以后的工作中一定会遇到,经常翻一翻就可以了,随着程序编写的深入,你一定会体会到其中的美妙与实用。
3.调试(Debug):程序员的基石技能
调试(Debug) 是成为一个程序员的基石。调试这个词第一个含义即是移除错误,但真正有意义的含义是,通过检查来观察程序的运行。一个不会调试的程序员等同于瞎子。
理想主义者认为设计、分析、复杂的理论或其他东西,是更基本的东西,他们不是现实的程序员。现实的程序员不会活在理想的世界里。即使你是完美的,你也需要与在你周围的主要软件公司或组织 (比如-GNU-) 的代码,和你同事写的代码打交道。这里面大部分的代码以及它们的文档是不完美的。如果不能看透代码的具体执行过程,最轻微的颠簸都会把你永远地抛出去。通常这种可见性只能从实验获得,也就是,调试。
重要的几种手段:
4.程序的性能问题:为什么程序很慢或者“爆仓”
假如你或你的客户认为你的一个系统或子系统运行太慢了。在你把它变快之前,你必须构建一个它为什么慢的思维模型。为了做到这个,你可以使用一个图表工具或者一个好的日志,去发现时间或资源真正被花费在什么地方。有一句很有名的格言:90%的时间会花费在10%的代码上。在性能这个话题上,我想补充的是输入输出开销的重要性。通常大部分时间是以某种形式花费在 I/O 上。发现昂贵的 I/O 和昂贵的10%代码是构建思维模型的一个好的开始。
5.如何睿智的写程序文档
人生太短,不能写没人会读的废话,如果你写了废话,没人会去读。所以好一点的文档是最好的。
首先,写好的文档是好的写作。我建议你找一些关于写作的事情,学习,练习他们。但即使你是一个糟糕的写手或者对你需要写文档的语言掌握不好,这条黄金规则是你真正需要的:己所不欲,勿施于人。花时间去确实地思考谁会读你的文档,他们从文档中想要获得的真正的东西是什么,并且你可以如何把这些东西交给他们。如果你这样做,你将会变成一个超过平均水平的文档编写者,和一个好的程序员。
6.预估编程时间很重要
为了尽快获得一个可以高效使用的工作软件系统,不仅需要为开发做计划,还需要为文档,部署,市场做计划。在一个商业工程里,这还需要销售和金融计划。没有对开发时间的预测能力,是不可能高效预测以上这些东西的。不论是理论上还是实践上,准确预测开发软件所消耗的时间总是被管理者所忽视。
最重要的事情是不要漏掉任何事情。例如,文档,测试,规划的时间,与其他小组交流的时间,还有度假时间,这些都是很重要的。如果你每天都要花时间和一些傻逼交流,在评估里为这件事情划一个明确的时间界限。这能让你的boss对于你将要花费的最少时间有了一个认识,并且可能给你更多的时间。
7.善待不好相处的人:让不好相处的人经常在保持忙碌。他们比别人更倾向于枯燥的工作,并且更能被动地忍受
程序员必须作为一个团队一起工作。当分歧出现时,它必须用某种方式解决,它不能被长时间挂起。不好相处的人通常是极度聪明的,并且有一些很有用的意见可以发表。不带对这个人的偏见,倾听并理解不好相处的人是至关重要的。
失败的交流通常是分歧的基础,但它有时候可以被巨大的耐心移除。尝试冷静诚恳地保持交流,并且不接受任何可能产生更大矛盾的引诱。在一个合理的尝试理解的周期后,再做决定。
8.学习新技能:在做中学
人类通过做来学。读书和上课是有用的。但你对一个从不写程序的程序员会有任何敬意吗?学习任何技能,你应该把自己放在一个勤奋练习技能的角色中。学习一个新的编程语言时,在你必须做一个大工程前,试着用它做一个小的工程。学习管理软件项目时,先试着管理一个小的工程。
试着让你的 boss 给你正规的训练,但必须知道,这通常并不会比把相同量的时间花在用你想学的技能来简单玩耍要好上多少。然而,要求训练比在我们不完美世界里的玩耍时间要容易得多,尽管大量正规训练只是在课程上睡觉,等着晚餐聚会。
9.分析数据:与算法同等重要的事情
有经验的程序员会成为设计者,最尖锐的设计者变成商业分析师,因此被冠名去思考所有数据需要,并且给你充分定义的任务去执行。这不完全是对的,因为数据是每种编程活动的核心。不管你在你的程序里做什么,你不是在移动数据就是在修改数据。
你的任务的底线是 Niklaus Wirth,多种语言之父,的金句:“算法+数据结构=程序”。这永远不是一个独立的自嗨的算法。每个算法都至少被设计去做一些至少与一段数据相关的事情。
由于算法不会在真空中滚动轮子,你需要分析其他人已经为你标记好的数据和必须写入代码的必要的数据。 一个小例子会使得事情更清楚。
10.如何管理开发时间
一个工程计划是一个估计,一个时间表,一系列取得进步的里程碑,还有对你的团队或者你的时间在每个任务的估计和安排。
工程计划存在的意义是帮助做出决定,而非展示你是如何组织的。如果一个工程计划太长或者不是最新的,它对做出决定将是无用的。
确保你的计划包括了:内部团队会议,写代码,文档,规划周期活动,集成测试,处理外部关系,疾病,休假,已有工程维护,还有开发环境维护。工程计划可以作为一种为局外人或你的 boss 准备的关于你或你的团队正在做的事情的视图。因为如此,所以它应该是短且及时更新的。
11.如何权衡程序质量与开发时间:一个好的设计会被糟糕的代码实现给击碎
记住,一个好的设计会被糟糕的代码实现给击碎。如果好的接口和抽象在代码中到处存在,最后的重写会更加痛苦。如果写难以修复的清晰代码很困难,考虑是什么与核心设计冲突的东西导致了这个问题。
如果用质量换时间影响了质量保证工作,(向你的 boss 和质量保证人员)指出这个问题。如果用质量换时间会导致在之后的质量保证周期中出现更多的 bug,指出来。如果她仍然坚持,你应该把劣质部分隔离到特殊的你可以在下一个开发周期计划重写或优化的组件中。
12.如何专业的成长:领导?经理?还是程序员?
承担超过你的权力的责任。扮演你想要扮演的角色。对那些对更大组织的成功做出过贡献以及对你个人提供过帮助的人表示感谢与欣赏。
评估你自己。如果你想成为团队的领导,去激励与团结。如果你想成为一个经理,担起规划的责任。如果你想要变成一个好的程序员,询问一些你欣赏的人你怎样才能变成他们那样。你也可以问你的 boss,他可以告诉你的东西会少一些,但对你的事业会有更大的影响。
13.教程目录