网站地图
RSS订阅
收藏本站
您的位置:网站首页 > 面试技巧

关爱码农成长:关于写代码二三事

作者:habao 来源:未知 日期:2016-10-1 23:12:21 人气: 标签:前端工程师面试技巧
导读:工作这么多年以来,一直从事软件相关领域,即使担任主管职务,也一直对技术充满热情。写代码写了这么多年,多少有些体会。我把自己对写代码这份工作的心得写下来…

  工作这么多年以来,一直从事软件相关领域,即使担任主管职务,也一直对技术充满热情。写代码写了这么多年,多少有些体会。我把自己对写代码这份工作的心得写下来,希望能给从事相关领域或有志于写代码的人参考。

  一、你适合当程序员吗?

  程序员,也叫软件工程师、程序设计师,我觉得「程序员」三个字简洁有力,是一种身份的象征。

  如果你正从事这份工作,恭喜你!这是个热门行业,在可预见的将来,也不会消失。不过也别高兴太早,这一行的技术汰旧换新非常快,必须不断努力学习才行。

  一点天赋

  打开一个空白文档,必须创造出代码。与所有创造性的工作一样,写代码需要某种程度的天赋。程序员生产力水平差别很大,倒不是说一天能写多少行代码(这可能是最没参考价值的数字),而是品质有天壤之别。天赋很高的程序员,一个抵十个,没天赋又不努力的,一天制造的问题可能多于解决的问题,可以说生产力是负的。具体来说,逻辑推理、抽象思考、创造力、理解力,这些都是技术水平的体现。

  当程序员并不一定要有多高天赋,毕竟像LinusTorvalds(Linux创始者)那样的天才很罕见,但一点天赋还是必需的。如果你发现自己写代码、看代码、改bug都很痛苦,半年一年了也不见改善,也许这份工作不太适合你。

  一些热情

  如果你对写代码充满热情,又有一定的天赋,那再好不过。最起码,你有时会沉浸在写代码或改bug的境界中(英文有个词叫「flow」,心流)、不想被中断,这样就够了。如果你从未出现过这种境界,那么你可能不会热爱这份工作。不过没关系,世界上不热爱自己工作的人其实不少。如果你能做好这份工作,眼前又没有更好的选择,继续做下去也没问题。

  十分努力

  努力是一定要的,当一名好的程序员,要学习的东西太多了,而且不努力很快就会被淘汰(虽然很多工作都是这样),这是入这行前应该要有对这行的基本认识。

  二、程序员基本能力

  1,职业道德

  什么?写代码也有职业道德?是的,而且还很重要。写代码是一门良心事业,因为通常你写的代码只要符合规格、能正确执行,就可以交差了,而你的主管或同事很难一眼看出程式码品质有问题,例如:在特定条件下会当产生bug、滥用复制粘贴、采用一些肮脏的写法、代码可读性很差、模组之间纠结在一起,等等。

  你焊接过电路板吗?要是电路板绕线一团乱、零件歪七扭八、接脚没焊好,你能交差吗?但是写代码可以。因为代码是一种抽象产品,没有「外观」可以观察。如果你的团队要求codereview,这个问题可以得到某种程度的改善,但仍不能彻底解决。程序员的纪律和职业道德很重要。

  2,代码语言

  语言的学习,是程序员最最基本的能力,而且应该至少精通一两种语言。随著工作经验的累积,学习不同语言的速度会越来越快,例如从几个月缩短到几周。当然精通一门语言,不是几星期、甚至几个月就能达成的,但迅速接手并维护既有代码,是对合格程序员的基本要求。

  通常第一次学语言要最久,因为很多观念也是第一次学,例如变数、回圈、阵列、递迴、I/O、网络、多执行绪、物件导向、regularexpression、functionalprogramming??。但等到学第二种、第三种语言,新的观念越来越少,主要在学语言本身,速度就会变快很多。

  3,资料结构及演算法

  如果你是本科毕业,代码结构及演算法应该是必修课。如果没学过,建议花点时间学一下。倒不需要买一本厚厚的书折磨自己,但基本的概念一定要有,例如:

  4,资料结构

  阵列(array)、串列(list)、堆叠(stack)、伫列(queue)

  树(tree)、二元树(binarytree)、杂凑表(hashtable)

  指标(pointer):这也许不算资料结构,许多高阶语言也

  不让你用pointer,但是对记忆体、指标要有概念,这是程序员与非程序员的区别之一

  5,演算法

  对以上资料结构的各项操作

  排序(sort):至少搞懂3、4种基本的排序演算法,例如bubblesort、quicksort、mergesort等

  搜寻(search):depth-first-search、breadth-first-search、binarysearch等

  其它:迭代(iteration)、递迴(recursive)、分治法(divideandconquer)、时间/空间複杂度的基本概念(bigO)等

  网络上资源很多,Google一下、多写一些代码练习,弄懂以上基本概念,应该就够用了。

  6,网络协议

  TCP/IP、HTTP、DNS等这些都是基本的网络协议。不需要到专家级别,但身为一个程序员,除非你的工作与网络完全无关(这种工作应该越来越少了),否则对这些网络协议的运作应该要有起码的了解。例如你能讲清楚,从你在浏览器输入一行网址到看到网页内容,在网络上发生了哪些事?以前我在Yahoo面试前端工程师的时候,喜欢问一个问题:请解释cookie是怎么运作的?结果不少人答不出来。

  当然现在的代码开发环境很方便了,各种library一大堆,我们通常不需要自己实做这些底层的东西。但不懂这些东西运作的基本原理,会让你在debug时被卡住,因为整个网络系统的运行,都是建立在这些基础架构之上。这些网络协议,再过很多年还是会继续存在,花一点时间搞懂这些,我认为很值得。

  7,除错能力

  讲除错能力不太准确,因为除错不是单一能力,而是结合了经验、对代码的了解、对系统架构的了解、抽丝剥茧的能力、直觉,以及各种hands-on能力的综合,就像当侦探一样。

  我在Yahoo工作期间,最刺激的事莫过于排全球on-call了。所谓on-call,就是全球Yahoo网站出包时,你要在最短时间内找出问题并修复,那真是超级debug。拜託,Yahoo网站那么复杂、代码又那么多,出问题的代码又不是我写的,美国同事都下班了,鬼知道怎么解决?对不起,那是你家的事,排了on-call你就得想办法解决。功能上的问题还有迹可循,最棘手的是像系统过载这类问题,爬log、写、trial-and-error,总之想方设法揪出元凶。

  程序员应该具备良好的除错能力,不管代码谁写的。另外,修bug也是一门学问,是采用锯箭法、贴狗皮膏药,还是找到病灶、解决问题背后的问题,就看程序员的功力了。

  8,写出可读、易维护的代码

  这个要求听起来很合理,不是吗?其实这是最难的。写代码这么多年,看过多少代码,我跟你说,这个世界上的烂代码占绝大多数,好代码只占一小小部分。我自己也不断在这条路上努力着,到现在也不敢说自己写的代码多好。

  为什么这件事这么难?我想了一下,大概有以下几个原因:

  可读性高的代码,通常是用很好的解法,解决了真正的问题

  你需要彻底了解问题(problemdomain)

  你需要考虑过至少几种合理的解法(solutiondomain)

  你需要对程式语言、程式库、既有程式架构和可运用工具很娴熟

  你要能以简驭繁,而这代表你掌握了更高的东西

  ——例如牛顿的F=ma、爱因斯坦的E=mc2,这是神人等级的功力(只是举例说明,写代码不需要到这样)

  9.你写代码必须很有纪律,例如:

  不着急马上写代码,先想清楚问题、解法、架构

  恰到好处的注释,少了不行、过犹不及

  用心想过的命名(业界有句名言:ThereareonlytwohardthingsinComputerScience:cacheinvalidationandnamingthings.)

  压抑copy&paste及产出一堆烂代码的冲动:

  ——Bingo!找到一段代码了,看我的copy&paste

  ——可以运行就很好啦、这么漂亮的解法……

  ——好累,我不行了,先commitcode再说

  在commitcode之前,自己再好好review一次(我个人经验,通常这个步骤可以改进代码好几个地方)

  10.越容易维护、扩展的代码,代表它的复杂度越低

  降低软件复杂度是软件工程的最大挑战,软件复杂度直接决定软件的生命。

  必须做到lowcoupling、highcohesion,而这两件事都很难

  低复杂度的软件系统,代表里面各个模块的复杂度都必须更低

  ——当你轻易多用了一个外部组件、增加了一个externaldependency,你就把它的复杂度整个带进来了,所以要很小心。

  11.现实环境的因素,导致好的代码不易产生

  写代码能够写几年?每个人情况不同,但无论如何,大多数人不会写一辈子。当了个人开发者若干年之后,最常见的角色转换就是先成为团队组长带组员(不同公司对这个角色有不同安排方式),此时除了写代码,还要负责带团队、对外沟通、掌控时程、照顾组员、处理突发状况等等。如果公司够大,公司可能还会提供更多资深技术职位,例如Architect角色。

  技术职之外,有的人会走管理职,有的人走专案管理或产品经理,甚至业务、行销都有;如果喜欢走技术,有的人会跳槽到条件更好、发挥空间更大的公司,其实选择不少。如果有心创业或加入创业团队,扎实的技术底子也会令你如虎添翼。

  8,结语

  最近学代码设计忽然变得很流行,「一小时学代码」、小学生学代码,好像代码人人都能写似的。当然练习写几行小代码是没问题,透过这些训练逻辑能力也很好,但真实世界的代码,复杂度远远超出这些沙盒小练习。事实上,随著电脑及网络技术的发展,现在的软件开发比起一、二十年前更复杂了,有时我都很佩服现在刚出校门的学弟妹们,要学的东西这么多,他们是如何办到的。

  洋洋洒洒写了一大篇,其实很多也只能点到为止。

  2016-6-2222:25

  2016/9/2210:20:45

  在9月27日的小米秋季发布会中,小米5S是绝对的主角。除了强悍的配置外,还有不少重磅功能。有位内测米粉在体验小米5S表示,发现了一个名为3DTouch的隐藏设置选项。这个压感功能可以手动选择开启,用途...

  2016/9/2116:25:49

  导读:日前公检法三方发文,从10月开始微博朋友圈里的信息可都能依法作为证据了,看来朋友圈再也不是法外之地,想发什么发什么了,那些天天发个人照片的可都得注意了。微博朋友圈能作证据个人照片可不能随意上传了...

  2016/9/2116:12:28

  昨晚,我们的小骄傲长沙小王子张艺兴所在组合EXO发行新专辑登上MBC综艺《starshow360》,节目中我们的中国成员艺兴不仅大方爆料还献出了自己的原创歌曲《独角戏》,让人不禁感叹艺兴真是个多才多艺...

  2016/9/2110:44:08

  现在的明星都去拍真人秀到不务正业╭(╯^╰)╮,but在吃瓜群众雪亮的眼睛中真人秀也分高中低档,北京电视台推出的《苗阜秀》就明显属于low档位的。你问小主,苗阜是谁?秀在哪里?别说话and别问我。《苗...

  本文来源宁夏在线,未经书面授权,禁止转载,本网转载并注明其他来源的作品,并不代表本网认同和证实内容的真实性,如侵权请及时联系我们,我们24小时内予以删除!欢迎大家投稿:!

推荐:

本文网址:
下一篇:没有资料
共有:条评论信息评论信息
发表评论
姓 名:
验证码: