非科班出身的设计师程序员比较容易缺乏哪些技能

非科班出身程序员比较容易缺乏哪些技能?用什么方法弥补比较好?
来源:互联网
最大的缺点就是:不知道自己不知道什么。
数学太差. 底层知识不牢靠. 没看过几篇论文. 以上我在说我自己. ==如果让我推荐, 我能想到的好书不多. 大约这个比较值得推荐:&what every programmer should know about memory& ==点评一下有人推荐的书单.楼上有人推荐SICP, 书当然是好书. 然而非科班学生入门的话, 看SICP之前最好先看看&小阴谋家& ... HtDP也是个SICP的前导书, 不过进度太慢, 我没耐心看完. CSAPP比较枯燥. 如果为了速成, 应该是很多人没兴趣读完的. 所以我更推荐薄一些, 更有意思一些的&binary hacks& 虽然这两本书的交集并不多... (真正和binary hacks对应的书应该是那本 &屌丝的自我修养& 就是讲装载/链接的那本... 在我测kpatch的时候把这两本书啃了, 然后现在都忘了... 貌似我忘记这些内容只用了一年...)TAOCP很多人推荐, 没几个人读过... 所以我总觉得推荐这书的人并不靠谱... 为了找工作, 还是去刷leetcode吧... 学东西一定要选最快的方法, 因为肚子很快就会饿.
基于这个理由, 我不推荐TAOCP. 事实上我总是更愿意推荐初学者去看"薄"的书. 快速入门, 想深入有的是机会. 但是入门时就被枯燥乏味的口水给吓走了还谈啥深入不深入...
补充涛吴书单: Computer Systems: A Programmer's Perspective Modern Operating Systems 冒号课堂另外最好学一门脚本 包括但不限于bash/perl/python因为计算机相关的课程,科班出身基本都学过,但是自学过脚本语言的人才是真正爱这行的人
所有称得上称职的程序员通常都有非常高的自学能力及欲望,我将题目理解为“非科班出身程序员比较容易缺乏哪些技能”。没有系统学习过计算机科学知识的程序员通常是兴趣驱动的,这往往意味着他们以解决问题为出发点,所缺乏的技能通常在理论和基本功方面,比如各类基本算法和数据结构。弥补这一点只需要读两本书,做一些习题即可。此外他们通常从一种技术起家,有可能对其“母语”的语法、范式、库、社区等等带有强烈的感情,可能会对于“敌对阵营”的技术,或者新鲜事物,产生排斥和轻视,影响到技术迁移和对新概念的掌握。不过这是个性问题,在科班出身的程序员之中也不少见。基本上没法弥补。第三他们可能会缺乏一些基本的计算机文化常识或曰“乡谣(Lore)”,比如 foo bar 后面的第三个占位符是什么、这些占位符什么来历、Dijkstra 是谁之类,科班出身基本上都知道的事情。这个也是看书就能补的。再就是英语可能会比较烂,不过也不乏知名英语兼成功学教师学过两行 HTML 就开始 bitching 国内程序员界如何扶不起。请注意我鄙视的不是 HTML。Update:补一个书单,仅供参考。Introduction to algorithms,作者首字母缩写 CLRS ,讲算法的。Structure and Interpretation of Computer Programs, 简称 SICP,一本有些被神化的书,不过的确值得一读。多数人初读此书,两章后会有眼前豁然开朗的感觉。虽然这书已经不再是教材了。封面是魔术师和 lamda 。什么是经典,这就是经典。Computer architecture: a quantitative approach,此书我还没看,因为我自己也不是科班出身,而且此前对硬件毫无兴趣(Dijkstra 说过 computer science is no more about computers than astronomy is about telescopes),不过据说讲计算机架构的书里这本很好。Concrete Mathematics: A Foundation for Computer Science,高德纳出品,讲述与计算机相关的数学知识。如果数学书只想看一本,这个应该差不多够了。Computer Networks,作者Tanenbaum。一本讲数字电路基础的书……可以省略,不过还是挺有趣的。TAOCP,若能看下去就看吧,看不下去也没啥,科班的都未必看得去。The Art of UNIX Programming,The Cathedral and the Bazaar,这两本是传道书,有些内容现在看来已经是常识了,不过仍旧值得一读。Code Complete (2nd Ed) by Steve McConnell,比较系统的软件工业流程认知和编程常识读本。The Pragmatic Programmer, 这本书讲授编程实作中的基本套路,过一遍有助于扫清盲点。《人月神话》(The Mythical Man-Month),中文版还不错。《最后期限》(The Deadline),中文版也还不错。Refactoring: Improving the Design of Existing Code,“重构”理论的集大成者。Design Patterns,“设计模式”的集大成者,作者四人帮,封面是埃舍尔的画。什么是经典,这就是经典。Programming Pearls,《编程珠玑》,茶余饭后的鉴赏小品,虽然说不定哪天就用到了。……待续。如果不脱产,这些书够读两三年的。所以科班出身最大的优势,可能就是有四年的时间可以读这些书,和同样读这些书的人交流,并且不用为别的事情烦恼。
以我來說,編程和計算機架構主要是中學時自學的,而算法在大學裡上過兩門課。但我的本科是認知科學,缺少了一些計算機科學必修課,例如編譯原理。另外,數學比較不足,所以近兩年自修一些抽象代數、拓撲、微分幾何等,將來準備再學一些微分方程和數值分析。現在也有很多公開課,只要英文可以,是一種很好的進修途徑。
私以为最缺乏就是敝校四大金刚之三:体系结构,编译原理和操作系统。 由于最近信息安全被炒得很热,大家反而把网络学的风生水起,比科班的还要厉害。
身为高中学历非科班吊丝程序员表示目前感觉最缺的是数学和英语。
个人比较认可 的答案。我自己高中毕业后做销售,后来做coder,现在在一家中型互联网公司做基层Leader,面过很多科班出身(大部分都是211、985毕业,公司要求比较高)的coder,这一方面还是比较有感触的。先说说一定会缺乏的技能:0. Algorithm、Math1. Data Structure
线性、树状等结构2. 编译原理3. 计算机结构体系
这一点在底层以及基础系统、中间件开发方面比较重要。4. 编码能力
大学里面写过10万行C/C++的人,在编码功底上确实优势很大。反应到工作就是,开发效率以及Bug数量。个人是我结合自己以及公司成员(大部分来自BAT、网易等公司)的出来的。弥补措施:0. 这个不好说,我在这一块进度比较缓慢, 的方法应该不错,也是我想实践的。1. 相关数据一本,用C实现大部分结构,应该问题不大,我就是这么做的。现在基本上常用的都不会有问题,且很清晰每一个结构的优劣以及内部实现。2. 不知道3.读过一本书《深入理解计算机系统》,可以补上不少知识。4.大量的写吧个人的一点经验,仅供参考。Ps:感觉Coder对软性能力要求更高,比如系统设计,解决问题能力等等。
认识一些朋友,缺乏的脑海里是对计算机世界的一个全景图。当然,科班的也缺乏,比如我。
反对@Chaos的答案。声明:我并不是来优越似的表达科班出身的程序员比非科班出身的要高明、优秀多少,而是以一个在读的未来的程序员的身份探讨一下系统地、有层次性地学习更加事半功倍。我假设@Chaos通过自学,大量地敲写、堆砌代码(事实上,他肯定也会有思考,看书学习的过程,但是他的答案展现的是无尽的写代码才是正道)成为水平不俗的程序员。为什么很多人认为科班出身的程序员会比非科班出身的程序员优秀呢?其实程序员作为理性的一群人,大家并没有这么武断,他们这么认为的原因在我看来应该是,科班出身,那么学习编程更加的系统,有层次,循序渐进,这样的学习出来的人基础更加雄厚,理论比较扎实,日后工作时学各种招式都很快。当然,很多科班出身的人也很菜,比不上某些非科班出身的,就像chaos说的某些非科班的秒杀80%985/211的学生不在话下,其实原因也不是科班不科班,而是很多科班出身的人并没有认真去学习,循序渐进的学习,而这些非科班的却相反。《算法导论》公开课的那位教授说过,你可以编写10年代码成为大牛,也可以选择学习一门优秀的算法课,然后编写2年代码成为大牛。这里是强调算法的重要性。但我们也可以容易的看出,系统地学好算法,将会对你的编程水平的提升有着莫大的助益。正所谓磨刀不但不误砍柴工,而将对砍柴大有裨益。回到这里,我的看法是,无论你是不是科班出身,系统地、循序渐进的学习才是王道,才是成为优秀程序员的康庄大道。通过不断地堆砌代码,编写代码成为可不可能成为大牛呢?当然可能!但是这并不能说明这是成为优秀程序员的康庄大道,虽然必要的练习是必不可少的。我不断朝着东走一样最终能达到西藏,但你不能说,朝西走更远,甚至行不通,更不能宣扬说去西藏最近的路是是一直朝东走。如果一开始就能够系统、循序渐进地学习,再加上多年踩坑的经验以及对于编程的兴趣或者毅力,我相信不管是否科班都会成为优秀的程序员的。我并不以所谓科班不科班看待程序员,但是我丝毫不赞成Chaos的言论,他所说的确实会有人因为那样成为牛人,但是他的方法并不可取,最重要的是在那里宣扬这种方法,很有可能给初学者造成误导,容易急功近利,误入歧途。条条大路通罗马,那为什么我们不选择康庄大道,而去选择荆棘小路呢?
我算是科班出身,但是所知所学也是自学居多,所见的非科班的牛人也不少。我诚恳地请靠堆积代码量成功的非科班人士不要误导后来人,你们的成功仅与你们的经历和目标有关,不是所有人都只是堆堆代码量就够了。我见过的非科班牛人以学数学的居多,数学思维好,逻辑清晰,很多时候有比我更富创造性的见地,这绝不是代码量堆出来的,是系统的、有目的地学习来的。这个领域不是只有会调API的码农,还有写library的程序员,还有奠定数学基础的理论学家。非科班当然可以做的比科班好,但是总把“我不会算法、不会编译原理”放在口头,那我也无法,你不会所以你比我有理。
我只想说,作为一个科班出身的人,看到题主的问题,与目前排名靠前的几个答案。心里真的好虚。其实,科班出身的,数学方面也几乎没啥基础。而算法,如果不是搞过ACM之类竞赛的,也都是一塌糊涂,顶多是略懂略懂。像算法导论那样的长篇著作,更只是浮光掠影的扫过几眼而已。不知道其他科班的学生是否和我感受一样。上基础课程的时候,我在想的是,能够用编程解决什么问题,然后感兴趣的恰恰是一些奇技淫巧,如怎么写个小游戏、怎么搞个黑客工具之类的。而网络发达的如今,这样的小东西比比皆是,很容易就找到一种莫名的成就感。于是,就会感觉诸如数学、线性代数、算法、计算机体系结构,都好无聊啊。而学校少数几个能够动手的课程,偏硬件的也许在捣鼓单片机,偏软件工程的,几乎清一色的Java EE,为啥,这东西最容易搞出一些理论来,好教。诸如分个组模拟一下做项目的感觉,写个需求分析、概要设计、详细设计之类。可那时我真的还比较懵懂,Java也仅限于知道一点语法而已。如何架构一个后台系统,真的跨度比较大。所以一直到课程设计,几乎都在琢磨类似SSH这样的成熟框架的使用。而这时,隐约感觉到,基础不牢,地动山摇了。为啥,因为很多东西不明白,看了很多介绍的书,就是看不明白。老师能教的也有限,大三之后,几乎就只在意成果,不在意你到底理不理解了。然后,这时学习的课程,几乎都是诸如设计模式、重构等艰深话题,由于根本没什么实践经验,所以各种被打脸。所以我可以总结说,大部分时候,由于作业、考试、实验报告的压力。很多方面都是死记硬背下来的。真的没有理解透。甚至,很多当时觉得理解了的东西,回头发现,其实理解偏了。直到实习切实应用、考研全面复习基础知识。才感觉自己的知识体系慢慢成型。——————以上就是我作为一个科班出身的人,真实的经历。工作有年头之后,才多次深感基础的薄弱,技能的缺乏,回头又看书,却比较容易理解了。但,真的很少有精力、有时间去看了。有时候,就是这么无奈、悲哀。科班出身的程序员也容易有技能缺失,前面的答案略有提及。如脚本语言(python, ruby, lua等),很多科班出身的就很少接触。如果有,都是自学的。而大部分,都仅限于主流编程语言(C,C++,Java等)。而且,多数因为连这些语言都很难掌握精通,很少有勇气去自学脚本语言的。所以,我觉得,无论是科班的、非科班,都会缺失一些技能。真正牛逼的,就是那些练童子功的吧,或者ACMer了吧。其他人,多数都很平庸。我有时假设,我重新念一次大学,会不会把技能点点的更全一点。多次推演的结果是:不会。估计我还是会这样走过,也许偏重不同,可能会更注重数学知识、算法等。也许最好的弥补措施,不是全面撒网去补缺,而是遇河过河、遇山翻山。从你现在的工作出发,遇到哪里不懂,由点及面的去读书、去研究。效果会好一点。列书单,往往是一种心灵的慰藉。除了学生、能去啃得下大部头的人,寥寥无几。而学生,又往往不懂这些看似无趣之书的价值所在。最终啃下来的,都是人中龙凤。人类历史上,龙凤总是少的。以上。——PS:本人211大学的计算机科学与技术专业(07级),不能代表一流大学的情况,但应该可以代表中流那一部分。
大部分答案都应该是出自科班的程序员,而我是一个典型非正统科班的无证程序员,不能说成功转型,至少在一线码农岗位上持续工作了8年,即将迈入第9个年头,希望可以用自身经历给楼主参考。我大学本科文学院广播电视新闻专业,记者班,纯粹的文科,所有课程都是写作与拍片,没有任何理工科相关课程,整个大学都是在分析吴忠宪与白岩松的电视节目中度过,作业皆是300字剖析《霸王别姬》、《我猜我猜我猜猜猜猜》、《小莉看世界》。所以是纯正得不能再纯正的非科班,连理工科一点边都不沾。作为一个民科,我并不赞同大部分科班出身同学的答案,转型并不靠读书或者补充理论知识,我自己走上程序员这条路的唯一方法,就是无比勤奋地堆砌代码量。码农作为一个工程职业,其核心并不是什么高深的理论或者牛逼的算法,真正重要的是你踩了多少坑,你是否踩过足够多的坑。除了极少数真正需要顶尖理论知识的算法,绝大部分日常开发,依靠的都是经验,特别是工程经验。看一本书,可能你看完就O了,可是你真的懂了?第一高分的答案说看完那些书要2~3年,可是你看完了那些书,就真的会写程序了?作为一个非科班的程序员,你要说服别人你写的程序比科班要好,只有你真的比科班的人写得好!因为你没有学位,没有系统的课程,只有真正从实战中越过学位这个坎儿,靠的就是你拥有超强的写代码的能力。而这种能力,只有靠写大量的程序和代码,积累经验,切实锻炼出比大部分科班同学更强的coding skill的能力。我在大学的时候,基本上每天都写十几个小时代码,天天背着笔记本上课,藏在抽屉底下,不上课,就闷头写。晚上也写,有时候一直写到凌晨2-3点(我自己一个人住学校附近)。一开始很困难,因为没有理论知识,所以有很多问题不懂。我建议遇到不懂,才查书,才查资料,而不是一开始没带着问题就虚无缥缈地看书,这样效率很低。曾经我这样建议过别人写大量代码,别人会问,到底写什么?写自己感兴趣的东西!你先创造出一个需求,你可以先作为用户,想一下你需要什么功能,一开始即使是无聊的,即使是已经有的,即使是别人写烂了的,都可以作为自己的题目,然后围绕着写。我推荐你参考一个很成熟的、很经典的软件(当然不需要很专业或者很难),模仿它做出你能做的所有功能。针对每一种功能,自己去思考一种做法,试图猜想别人会用什么方法实现。在你做完之后,可以搜索一下网上的资料,进行印证,不断修正自己的设计思路和代码架构想法。这是一种极好的习惯,养成这种猜别人思路的习惯会让你越来越熟悉各种软件的架构方式,也越来越熟悉如何去通过软件的表象猜出它内里的设计思路。我现在的主业是游戏引擎设计,基本上我看了一下游戏引擎的一些表象,已经可以猜出大部分它的设计细节。而熟悉别人思路还有一个重要的作用,就是把自己的思维模式向正统工程学靠拢。遇到一个问题,如何剖析,如何抽取重点,如何平衡利弊,最后架构解决方案,在软件工程方面解决这些问题的思路都有一套正统的想法,虽然你没有经历过ACM训练,虽然你没有上过软件工程的课,虽然你没有读过这方面的著作,但你熟悉了主流软件世界对这些问题的一贯思路,你也会逐渐变得像他们一样思考,你会遵循这种思维模式解决问题——肯定比你大学上四年课程,考几次试,读十本二十本所谓的好书,要管用得多。但最后你还是要回归——在用野路子让你获得一般科班程序员都无法媲美的coding skill、以及已经可以熟练运用主流软件工程思维解决软件架构问题之后,你需要回归到正统理论中来,这时候可以读一些著作,而这些书在网上可以一搜一大把,随便读,随便看。反正这时候你补充理论只会让你更强,而且你理解得更加透彻,更精准,绝对比上课听老师照本宣科要更加深入理解。如果你能够充分利用4年本科时间,基本上你可以足够堆砌出几十万行代码,而如果你又不是特别笨,你应该可以秒杀大部分浑浑噩噩玩dota过的计算机本科生。如果你还可以在某一个领域——比如图形、或者编译、操作系统之类的,有比较深入的修为,而又稍微比一般人聪明一点,你还可以直接干掉80%的985/211研究生。那些帮老板干活,只是每天上班打卡、作业应付、考试抄袭的人,是远远干不过拼死拼活堆砌代码量的实战非科班生的。而最最最后,你需要的是自信,非科班生绝对可以做得比科班生要牛逼。写个程序而已,有多高深?非得读个几年书?你读书的那会儿,我写的代码量绝对比你屌多了,我读的paper比你多多了。反正说白了,只要你肯不要命的、勤奋地写代码,你会出头的,我保证!
高三的时候我也是收到过一个做科学可视化的公司的面试邀请的,不过后来人家发现我是高三就罢了。所以我也算当过一把非科班出身的程序员吧。后来读了软件工程,就变成科班的了。想想读计算机前后到底有什么区别?无非就是好好的搞了一把算法导论,学会怎么做测试,怎么组织软件生产劳动了,做一个优秀的项目经理(跟产品狗是不一样的)了。这些也不是只能在大学才能学会,你只要进了一个靠谱的公司,耳濡目染,也是可以很快学会的。只是靠谱的公司多半要求比较高,非科班出身因为没受过训练的进去略难,这算是一个良性循环了。不过只要你肯好好补上这些功课,还是没问题的。
但凡你能在学校里学到的本科级别(甚至可以说硕士研究生级别)的知识,总能找到公开的教材、书籍、学术资料自己去学,或者最不济花点钱托人帮你复印到。对于计算机、数学这类对实验设备要求很低的学科尤其是这样。所以我看不出科班不科班有什么区别,全在于你自我要求到什么程度
底层知识。非科班出身的程序员,目测大部分是培训机构几个月时间出来的,一开始是java最基础的语法,然后上来就是ssh+mysql,安卓。。。然后?对不起,课程够时间了,结课了,给你发毕业证了。然而,计算机组成原理、数据结构、算法、计算机网络、操作系统、设计模式这些并没有学,甚至听都没听过。
GeneralAndroid:
最大的缺点是不自信吧,总是认为科班出身的好厉害。。。。。其实都一样的,除了天赋,就只剩下大家花时间多少的问题了。
高等数学,线性代数,概率与统计,离散数学,算法和数据结构,操作系统,网络协议,计算机组成原理,编译原理,图形学,人工智能,数据库系统等等等等。每门课程一般都只安排一个学期,平均也只能学个大概,考试不挂的程度。更不会教你有问题先google,对待新技术要持空杯心态这些。科班出身的平均水平不高的
同意匿名用户说的,其实纯学计算机的话,个人没有太浓厚的兴趣的话,算法这一块能力很弱是很正常的。理解了剥掉算法的数据结构之后(难度还没高中数学高)利用现成的库实际上甚至足够应付大部分的中高级工作了(注意不是底层工作)。计算机从科学角度上其实是很浅的,任何工科,土木啦,机械啦,生物,甚至于金融工程的对算法和数学的需求都碾压学计算机的。我个人从计算机专业出来的感觉,专业和非专业的主要区别,一个是软件工程的打底,一个是计算机原理和编译原理构造的对整个体系的理解。前者没有解决任何问题,但提出了一个软件工程是可控的空想乌托邦,于是我在十几年编码生涯中,永远无法在(痛苦不堪的)写完模块之后停止思考和质疑,这个习惯大大强化了脑海里各种组织,结构,抽象概念的培养,而不是停留在某个具体语言的某个具体框架的某个具体哲学(宗教)上;后者会让我写完一行代码的时候能直接想像出来代码会变怎样变成编译码,编译码会怎样变成电平信号在cpu和内存里把东西倒腾来倒腾去,最终变成屏幕上的像素点的过程,这个过程起到的作用,除了能轻易理解多线程和优化性能之外,还可以强化我们码农的刨根问底的强迫症倾向,我们强迫症无法接受已经掌握的这个巨大的白盒子里面混进一个黑盒子进来,理论上一切都必须弄成是透明的。(所以程序员不可能去问熟悉领域的问题,白盒里怎么会有问题,这是完全情绪化的下意识反应,结果碰到盲点,其实真有问题的时候就砸了)最终达到什么效果呢?举个例子,职业小说家永远不是按照故事发展想出故事进程写在纸上就够了,他们脑子里能同时想出这一段故事的20种发展模式,整个故事完全在他们的掌控之下,整个故事的一切其他发展的可能性也完全在他们的掌控之下,他们就是故事世界观里的神,写出来的故事只是千万个平行宇宙里一个偶然而已。而程序员成精之后,就会变成他们所写的模块的神,他们不是写一个模块把功能实现,而是知道用无数种结构,无数种语言,无数种未来的功能拓展可能性下这个模块的写法;也知道这个模块将来一切的可能的功能扩展的时候需要如何修改的写法;同时知道这个模块永远写不到哪种程度的写法。我自己脑海里就有“任何语言都实现不了”的一些遗憾,任何新语言,新框架出来的时候都会兴冲冲的跑去审视一遍看看是否有所突破,然后悻悻的关上网页。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动每个优秀程序员必须具备的技术技能 - 简书
每个优秀程序员必须具备的技术技能
我的意思是,如果你不能编写代码和开发软件,那么你学习众多软技能有个卵用。也许你可以成为一名优秀的管理人员或指导人员,但不会是软件开发人员。如果你正在阅读这篇文章,那么我假设你有兴趣成为一个软件开发人员——或者是更优秀的软件开发人员——下面就让我们来聊一聊你需要知道哪些技术技能。用技能赚钱↑现在,有这样一种主流观念,压垮了很多新手软件开发者,那就是你需要学习很多东西才能成为软件开发人员,并且很多人不知道从哪里开始起步。这里我会尝试着具体说明那些在你追求成为软件开发人员的路上将让你受益的必要技术技能。一篇文章当然不能详尽说明作为软件开发者,你可能需要掌握的所有技术技能,但是我会列出最关键的一些技术技能。
图片发自简书App
编程语言↑我认为从这一条开始说起是最合适的。不懂编程语言,怎么能成为一个真正的程序员?不过,关于选择哪种编程语言去学习可能并没有我们想得那么重要这一点,请允许我一笔带过。相反,让我们谈一谈为什么我们要从一种编程语言开始,而不是试图去学习所有的东西。许多新手程序员会试图一次性或在第一份工作之前学习几种编程语言,以便于有备无患。虽然我认为你最终应该学会一种以上编程语言,但我不建议提前这样做,因为这只会导致混乱,并且会分散你需要学习的其他技能的精力。相反,我建议你应该深入研究,重点学习单一编程语言的来龙去脉,这样你才能对用这种编码语言来写代码信心十足。那么在你决定想要成为什么样的开发人员的时候,怎么样才能尽可能地独树一帜呢?如何构造代码↑在学习了一门编程语言之后——或者最好是在学习的同时——我坚信,你需要知道的下一件事就是如何正确地构造你的代码。我所说的构造代码是什么意思呢?我的意思是,要写出好的,清晰的,易于理解的代码,不需要大量注释,因为代码本身就是一种表达方式。很多软件开发者在他们整个职业生涯都不曾去学习这个技能,这是不幸的,因为这是我——以及其他许多人——判断一个软件开发人员技术和能力的主要方式。良好的代码结构展示了对这种技艺的热衷,而不仅仅是为了完成工作。构建代码是软件开发真正的艺术部分,但它也是至关重要的,因为你和你的同事得花费相当多的时间来维护现有的代码,而不是编写新的代码。具体应该如何正确地组织代码我就不说了,因为我已经给出了一个很好的资源,但是要努力学习如何从一开始就写出好的、干净的代码,而不是事后学习这个技能。我只能保证,即使你是个新手,如果你可以写出好的、干净又简洁的、易懂的,本身就可以表达意思的代码,那么任何面试官看到你的代码都会觉得你是一个有经验的专业人士。并且在一定程度上,或者至少在这条道路上,因为你会将这个职业当作一种专业,而不是一份工作。面向对象的设计↑这一条是有争议的,特别是如果你正在学习的编程语言并不面向对象,但是有大量的软件开发世界会按照面向对象设计的思维思考,所以你需要确保你了解它。面向对象的设计是一种将复杂程序设计分解为单独的类或对象(类的实例)的方法,其中封装功能且具有特定的角色和责任。在软件开发中,我们总是试图管理复杂性。从对象的角度思考可以帮助我们做到这一点,因为它能让我们从一堆交互组件中定义并设计一个复杂的系统,而不是作为一个整体的试图解决整个复杂性。现在的编程世界有着大量的函数式编程语言,但你在软件开发中找到的最流行的语言和模式,仍然深受面向对象设计和分析的影响。你应该好好理解什么是类,继承的不同类型——何时使用它们——还有理解像多态性和封装等术语。算法和数据结构↑如果你上传统院校学习并想获得计算机科学学位的话,那么这是一个很大的考点。算法是解决各种计算机科学/编程问题的常用方法。例如,有若干常见的在程序上用于排序的算法。每一种排序算法都有一系列关于速度,内存大小要求,以及数据理想类型的不同属性。计算机科学领域有很多这样的算法,并且理解如何变化这些算法来解决你可能遇到的棘手问题也很重要,当你解决现实编程问题的时候。通常情况下,擅长这些算法可以让一个开发人员在1个小时之内就能解决可能需要另一个开发人员几天时间才能搞清楚的问题。除非你熟悉和擅长算法,否则你甚至不知道已经有了优雅的解决方案在那里。因此,仅仅只为这个原因,我认为这也是一个值得掌握的宝贵技能。数据结构也是如此,并且可以与算法结合使用。有几个所有软件开发者都应该熟悉数据结构中的,包括:数组或向量链表堆栈队列树哈希集合通过熟练掌握数据结构和算法,你可以轻松又优雅地解决许多艰难的编程问题。↑当我开始编程的时候,我在数据结构和算法方面非常糟糕,因为我主要是靠自学的。很快,随着我遇到了一些我不知道如何解决的问题,我发现这些技能在真正的编程世界非常有用,而且解决起来相当简单——和有趣。事实上,我认为这是软件开发最有趣的领域之一。解决难题并利用数据结构和算法来开发一个又干净又优雅的解决方案,真的很有意义。学习这些东西是一个挑战,但非常值得。这是可以让你超越众多同行的技能之一。大多数软件开发人员都不擅长这个领域。如果你想通过如微软或谷歌这样的大公司的面试,那么你一定得掌握这个技能集。开发平台及相关技术↑你应该具备一些经验,并至少掌握一个开发平台以及与之相关的技术或框架。我所说的平台是什么意思呢?好的,通常它的意思是操作系统(OS),但也适用于其他可以充当类似于操作系统角色的抽象。例如,你可以是专注于Mac或Windows操作系统得Mac开发者或Windows开发者,你也可以是一名专注于特定的web平台的web开发人员。具体确切的关于平台是什么就不讨论了——不同的人会有不同的看法——但这里我要定义平台为你开发的特定环境,它有自己的生态系统和特殊性。再者,这是另一个我认为选择并非那么重要的技术技能,只要你选择了一个就好。企业通常会聘请开发人员针对特定的平台或技术开发软件。你作为iOS开发者将更容易找到工作,如果你专业于那个特定平台的话。这意味着要熟悉平台本身,以及开发工具,惯用模式,还有大多数程序员在为那个平台开发时会使用的通用框架。你可能会认为编程语言的选择决定了平台,但实际上事实情况很少是这样的。就拿C#举例。如果你是一个C#开发人员,那么你可以用这种编程语言为Windows,Mac,iOS,Android,Linux,甚至是嵌入式系统写代码。所以,不要仅仅只是选择语言;还要选择平台。框架或堆栈↑除了学习特定的编程语言和平台,我高度建议去学习框架,或者更好的是,与之相配套的完整的开发堆栈。
图片发自简书App
什么是框架?什么是堆栈?框架就是一系列被用于在特定平台或多个平台上开发代码的库。它通常可以使得在该平台上的编程任务变得更加容易。看这个C#的例子。大多数C#开发人员使用.NET框架来编写C#应用程序。 .NET框架包括许多库和类,能够让C#开发人员在更高的抽象级别上工作,因为每当他想做什么事情的时候,没有必要完全重新发明轮子。例如,.NET框架的部分还包含了处理图像的代码。这类代码从头编写是极其困难的,所以框架极大地帮助了C#开发人员去编写需要以某种方式处理图像的代码。堆栈则有点不同。堆栈是一组技术,通常包括一个框架,并且常一起用于创造一个完整的应用程序。例如,有一个常见的称为MEAN的栈。它代表MongoDB,Express.js,AngularJS,和Node.js。MongoDB是一个数据库技术。Express.js是一个用于创建web应用程序的Node.js框架。AngularJS是一个用于为web应用程序创建用户界面的前端JavaScript框架。最后,Node.js是一个用JavaScript开发基于web应用程序的运行时环境。有没有理解所有这些东西并不重要—— 除非你打算成为一个MEAN开发者——重要的是要明白,如果你知道所有这些技术和框架,那么你就能够开发一个完整的web应用程序。栈使得创建应用程序变得更容易,因为它们提供了一种许多开发者用来开发应用程序的通用范式,因此知识可以很容易地共享,并且你也能确定哪些特定的技能集市可以一起工作的。学习堆栈真的是非常有价值,因为这意味着你拥有开发一个完整的应用程序所有必要的技能。很多使用特定堆栈开发应用程序的企业,更愿意雇用那些熟悉那类堆栈能够立马开展工作的软件开发人员。基础数据库知识↑即使数据库的景色在过去几年时间里已经改变了不少,但我不认为数据库会很快消失,因此对此了解一二总是不会错的,对吧?
图片发自简书App
当前主要有两种数据库技术:关系数据库和文档数据库。现在的开发人员至少应该熟悉关系数据库,并稍微了解文档数据库。在软件开发中,数据库经常被用来存储应用程序的数据。当然,有些团队甚至有专门的数据库开发人员或数据库管理员(DBA),但是这并不能真正允许你不懂至少是基本的数据库知识。最起码,你应该知道:数据库如何工作如何执行基本的查询来获取数据如何插入、更新和删除数据如何连接数据集此外,你可能会想知道如何以编程方式从你的代码与你所选择的平台和/或框架检索和存储数据。大多数开发者被期待能够编写与数据库进行交互代码。源代码控制↑源代码控制是任何软件开发项目的组成部分。在我们使用源代码控制之前,我们必须在网络上共享项目的所有文件,或者通过U盘来回查看存储在上面的不同软件版本。虽然我很不想承认,但我的确不止一次地玩过这个把戏。但是,我还年轻。我蠢。你却没必要像我这样。当前,几乎所有专业的开发者人员都被期待懂得如何使用源代码控制来反复检查代码,并希望懂得合并来自多个源的变化。最基本层面的源代码控制可以让你保持在一个软件项目中对不同的文件所做更改的历史记录。它还允许多个开发人员在同一时间工作于相同的代码,然后合并这些更改。具体就不细说了,但你应该知道如何熟练地使用至少一个源代码控制系统,并且你应该熟悉大多数基本的源控制概念。在当今软件开发领域,几乎所有专业的软件开发团队都会使用某种源代码控制。构建和部署↑现在,大多数软件开发项目都有着某种自动化的构建和部署系统。有几种不同的软件应用程序,可以帮助软对自动化这两个任务,曾经是手动,当然对于某些团队而言,现在仍然如此。你问什么是构建和部署?好问题。你知道如何写代码,并检入到源控制系统吗?拥有一些方法来确保代码可在你检入后真正能工作很不错。这就是构建系统的用武之地。最起码,构建系统将编译所有代码,并确保没有编译错误。一个复杂的构建系统可以运行单元测试或用户测试,运行代码质量检查,并提供关于代码库当前状态的一些报告。部署系统将负责部署代码要么到生产机器要么可能到某种测试环境。你不必成为这些技术的绝对专家,但是了解至少这些系统如何工作的基础知识,以及构建和部署代码的过程,是非常重要的。通常情况下,创建和维护构建和部署系统的实际职责属于所谓的DevOps(developer operations的简写)——这个快速增长的领域。但是,这并不妨碍你至少了解关于这个过程如何工作的基础知识。测试↑曾几何时开发者并没有必要知道太多关于测试的内容。我们习惯于写一串代码,然后扔给测试人员,让他们去找代码中的各种bug,然后我们再来修复bug。切不可再如此。随着越来越多的软件项目开始采用所谓的敏捷过程,(后面再方法这一点中我们再细谈),软件开发人员和测试人员不得不更密切地一起合作。质量已真正成为了整个团队的责任——我倒是更想说,它一直都是。随之而来的是,你需要了解一些关于测试的东西。你至少应该熟悉如下基本术语:白盒测试黑盒测试单元测试(不是真的测试)边界条件测试自动化验收测试一个好的开发人员——我假设你至少想成为一个优秀的开发人员——会在将代码交给别人之前测试自己的代码。如果你真的想被认为是专业的,并非浪者虚名,那么这一条没有商量余地。调试↑嗯,很多新手软件开发人员在调试时都感觉自己像是在用鸡蛋碰石头。每个人都希望写代码,没错吧?但好像没有人愿意调试自己的代码?这就是真相。大约90%的时间软件开发人员是用来搞清楚到底为什么代码不能正常工作。我知道你只是想能够整天写新的代码,但是此路不通。如果你采用如测试驱动开发这样的方法,那么你可能会少花很多时间在调试上,但无论如何,不管你做什么,不管你如何努力,你都不得不学习如何调试代码或其他人的代码。因此,与其采取一种随意的方式来做一些你不得不做的事情,还不如咬紧牙关竭尽全力学会如何有效地做好这件事情。方法↑有没有被我列出来的需要知道的事情清单吓倒?好吧,还有一个——但是我保证这是最后一个。虽然一些软件开发团队才刚开始写代码,不择手段只要完成任务即可,但是大多数团队还是至少遵循某种方法的。出于这个原因,熟悉一些最常见的软件开发方法背后的基本理念至关重要。今天,我要说的是瀑布式开发和敏捷开发。大多数团队会声称他们正在做敏捷。敏捷本身是一个非常松散的概念,但也有一些做法和——原谅我的措辞——固定程序是你应该知道的,如果你不想只是纸上谈兵,想要打造一支敏捷团队的话。不堪重负?不需要↑我知道这些内容通通要掌握的话,有点多,而且我仅仅触及了大多数主题表面的东西。现在,你可能会觉得有点不知所措,有点不堪重负,面对这些所谓的技术技能一片茫然。没关系。你用不着这样,除非你已经是一个软件开发从业人员,在这种情况下,可耻的是你!(开个玩笑。但你真的最好需要提高自己了,真的。)
当十月的第一缕阳光带着清晨丝丝清凉温和的铺在身上的时候,我就知道,这是生命中不可多得的幸福时刻...}

我要回帖

更多关于 非科班出身的导演 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信