以下为译文:
我在20岁从大学辍学,后来又作为共同创始人创办了一家深度科技创业公司,过去的5年对我来说是一段曲折而又启迪心智的旅程。在这段时间里,写代码一直对我的生活发挥着积极作用。
它帮助我找到了生活的目标,以及一个有很多志同道合朋友的全球社区。虽然我离完全搞清楚如何创业还有很远的距离,但当我回顾自己刚开始时的一些主要疑惑时,我才意识到很多其他人可能也曾经有过类似的疑问。
(长帖预警。所有观点均为我的个人看法。另外,这篇帖子面向的是所有刚开始学习的开发者和程序员。如果你已经是一个经验老道的开发者了,那这篇文章对你来说,可能除了能带你重温一遍初学编程时的记忆以外别无它用。)
你应该从哪门编程语言开始学习?
任何一门都可以!
直接开始使用任何一种流行的语言写代码就可以,不论是Python,Java,Javascript,Golang,Perl,C,Ruby,Julia,Haskell,还是PHP。你很快就会发现它的优雅之处,也会跌跌撞撞地遇到它的怪脾气,并开始与这个语言建立起一种亲密的相爱相杀的关系。你也会发现它背后超级棒的社区,而且也许你会爱上那里的朋友们!
流行的那几种语言几乎都是多用途的,任何一门语言都可以用来做任何事情(Javascrip现在都能用到卫星上了!),所以选哪一种都没错。
随着代码量的增多,你会发现编程语言其实就像人的语言一样,你需要根据自己想定居的地点来决定学习哪一种。
如果你要在俄罗斯定居,在那里说英语的话也许也有人能听懂,但你如果说俄语的话就能保证所有人都能听懂了。相似的,如果你想在游戏领域扎根,建议你学C++,而对于客户端的Web,比如说浏览器来说——JS是唯一的选择,数据科学领域则由Python 和 R语言统治。
说到底,是你在给机器下指令做一些事情,而这些指令可以用多种语言来表达。要开始试着把语言当成一个抽象层,它位于在你和机器之间,是一种交流的媒介。很快你就会发现,对编程艺术的研究远比语言本身重要得多。
我强烈推荐你听一听下面这个redhat播客,它能带你了解编程语言的进化原因和过程。(https://www.redhat.com/en/command-line-heroes/season-2/hello-world?ref=hackernoon.com)
太长不看系列——甚至你选Basic(我在11岁的时候就自学过它)我也不在乎,反正就先动手写一个挺酷的玩意儿出来就对啦!
你应该从何处着手开始学习呢?
从这里开始!
就在你现在看着的这个浏览器,你正在阅读的地方就可以开始。到了今天,互联网已经能够提供最详尽的学习资源,它是你能接触到的最大的图书馆,也是能够最大化促进教育公平的工具。在我们生活的这个时代,你在任何时刻都只需轻轻地点击一下鼠标就能即刻获取到世界上所有的知识。
(图中文字大意:欢迎来到幼儿园!“你现在的意思是说,我所接受的教育的安装进程足足要花13年!这个学校用的是哪门子的过时软件呀?”)
也许你可以跳过学校这一步,直接从互联网上学习。(开玩笑的。而也许我是认真的呢?)
从Youtube开始,想学什么就搜什么,然后开始疯狂地看。试着报名参加在线课程,你可以跟着课程一起写代码,甚至做得更好,尝试将你自己的小项目融入学习过程,最大限度地提高你的学习效果。
随着你的代码越写越多,你会发现,你最宝贵的经验并非来自于精心策划的教程,而是来自于凌晨三点还花费大量时间沉浸在GitHub(阅读他人的开源代码和issue),Stack Overflow和官方文档里。真正的知识就隐藏在这里,远离所有的浮华和虚伪!
不过有一句话要提醒你,在你想付费学习任何课程之前,请先把所有能接触到的免费资源看完用完。你会感到惊讶,你所需要的大部分学习资料其实都能免费得到。提防那些承诺有“收入分成协议”的“学院”,那些仅仅是糖衣炮制的骗局而已。
在我看来,专业的编程教学业务可能会阻碍学习者的好奇心,并仅仅将他们的天赋限制到“可雇佣”的模子里。
太长不看系列——不要花钱,去谷歌搜一下,上Youtube看一下,看完那些瓷实而丑陋的文档,这将是你漫长的学习之路中非常重要的一部分!
你要用代码实现什么?
什么都可以!
你想写什么就写什么吧,不论是一个游戏,一个网站,一个APP,一个电路板上的IoT电路,一个仿真ERP,像解谜那样的数独或hangman,任何你想写的,只要不是被迫写的就都可以。看看这个我很早以前写的井字棋游戏,凡事都要有个开头的。(https://kshitijpurwar.github.io/DumbTicTacToe/public/?ref=hackernoon.com)
我曾经用BASIC的switch case语句编写了个小字典,里面只有13个单词,输入单词的时候就会给出定义,是个挺没用的程序,但是对那时候幼小的我来说,帮助理清了一些基本的概念。
你会需要练习,学习如何理解语句管理,抽象的概念,逻辑的分离,DRY原则,控制和数据的流动,模式和反模式,内部和外部的交互,系统设计等等。这些都是编程的基础模块,一旦掌握了这些,你几乎就能够设计和构建出任何东西了。学会在系统层面思考是一种关键的技能,毕竟你要么就自己创建一个系统,要么就需要在某个系统当中工作!
这一部分只有一个建议,请不要限制自己只做一些陈词滥调的项目,比如Twitter的情感分析,或者是你在课程中跟着做的那种项目,而如果你要做这种项目的话,请在其中加入一些你自己的新意。像这些的老套项目散发着以简历加分为目的的恶臭,缺乏原创性。释放你的创造力吧,写出一些奇怪而独特的东西,唯一的目的是学点东西,这可能大有裨益。
不要妄图用自己第一次的代码创业,如果你已经这样做了,那我给你点赞,但是刚开始写代码最好还是不带目的地去做,随便用代码实现什么都可以!
竞争性编程是必要的吗?
不是。
FAANG的追随者们会希望你相信这是通往最迷人工作的捷径,但事实并非如此。这就像拥有6块腹肌一样,你肯定看起来很酷,可能会在Uber找到一份工作,但也仅此而已了。
不想做是完全没有问题的。就像锻炼肌肉一样,是的,你可以举起50公斤,但你看到有多少人每天在大街上举重的?所以只要保持身体强健就好了,培养自己的技术、心态和适应能力,遇到任何问题,你都应该毫不犹豫地上去解决它。
健壮分两种,健身房那种和实际功能性那种,要知道区别呦!
算法考试是考察一个人逻辑思维和解决问题能力的一种实用方法,这也是为什么大家都偏向于使用这种方法的原因,但你能用来突出自己编程能力事情还有很多。了解人们面临的现实世界问题,培养自己抽象化以及解决问题的能力。作为一个开发者,工作远远不只意味着和机器之间的交流。在现实生活中,人的因素会参与其中,而培养软技能也是必不可少的!
如果你觉得自己缺乏竞争性编程实践而处于劣势,这在一定意义上的确是事实,但也只是对少数几家精英公司而言,对其他公司来说,基本的编程技能和学习能力就足够了!
“擅长编程比赛与工作上的优秀程度呈负相关”
在将机器学习应用于在Google招聘数据后,Peter Norvig得出这样的观察结论。
从短期来看,它可以在大学校招的激烈竞争中提供优势,但从长远来看,没有人应该把缺乏竞争性编程经验看做自己职业生涯上的障碍!
我并不是说不鼓励竞争性的编程,事实上,它确实对培养编程能力有一定的帮助。但在现实生活中,编程工作的很大一部分内容就在于不断地碰壁,一边碰壁一边尝试。任何人如果觉得有捷径可以跳过这种撞南墙的过程,那简直就是白日做梦。
众所周知,印度人由于其严格的教育体系,以及有缺陷的“狼多肉少”或零和博弈思维,比如“抢凳子”的心态,使他们具有超强的竞争意识。但在编程界这种思维方式不会让你走得太远!
你必须接受过一定的培训,拥有一个学位或受过指导吗?
不完全是这样!
是的,如果有人能指导你,这肯定是很好的,但这不是必要条件,你可以自己指导自己。是的,你会跌跌撞撞,经历很多次的失败(也许会比你有指导的情况下的失败多很多次),犯很多愚蠢的错误,等等。但是,这都没关系!
你能在失败中学到的东西远比在成功中要多。 ——JAY Z
在生活中,你能从失败中学到的东西要比成功更多,所以要学会拥抱失败!
如果你思考得足够深,你会发现,这些疑虑其实不是你自己产生的,而是社会长期以来往你的大脑中灌输的,你把这些疑虑吸收了,误认为是你自己产生的。如果你想成为一名优秀的程序员,你得学会在没有任何外界帮助的情况下独自作战,所以你需要勇敢起来,而且要有耐心。
硅谷最具传奇色彩的故事都是关于耐心和一腔热血的,而无关血统背景。
从我自身来说,我观察到一个很重要的现象,我们总是高估这个世界塑造我们的能力,而低估了我们自身奋斗的能力。这就是为什么我们总是试图找人辅导,原因就是我们没有教会自己如何带着纪律性和热情去自学!
让自己随着好奇心随性而为(传奇人物Paul Graham的《天才公车票理论》,The Bus Ticket theory of Genius),探索这个世界,而不要过于用力!
我同意,学业和事业之间,的确有一种隐含的因果关系,但如果你让自己被激情所驱使,做一些真正让你感动的事情,你会在人生的道路上走得更远的。
如果这篇帖子让你产生了共鸣,或者帮助你在个人的旅程中点亮了一盏灯,那么我就很开心了。
原文:https://hackernoon.com/5-things-i-wish-i-knew-when-learning-to-code-l1ai3z37
本文为 CSDN 翻译,转载请注明来源出处。
更多精彩推荐
☞Python 爬取周杰伦《Mojito》MV 弹幕,这个评论亮了!
☞Mybatis 逆向工程使用姿势不对文档全被清空,一怒之下写了个插件……