如何成为一名程序员——善用搜索的艺术

大四秋季学期的我,正经历着严重的自信心不足的问题。我慢慢明白自己并不希望成为一名学术研究人员。统计学让我很头大,永无止境且枯燥的学术研究让我倍感无聊。我是那种成果导向的人,喜欢实实在在的产品,并有规定的截止日期,具有二元性:成功或者失败。进入大学的最后一年,我又有了新的感悟。我学习的所有技能都是为做研究服务的,如果我不打算从事学术研究,那么……我将一无所有!
在美国的文理学院(liberal arts college)主修计算机科学并不意味着你就是一名“黑客”。你可以简单的将它比喻为:在不同的部门购物。第一次在一个计算机入门课里看到command line,你发现你喜欢使用它。也可以意味着,你将要选择一两个编程语言,也许在你拿到学位的时候,你会写你自己的shell,创建你自己的解释器,甚至从头设计一个数据库系统。文理学校计算机科学专业为你提供了研究计算机科学的必备的条件,但这与软件工程区别很大。就像比较一个理疗师与一个运动员一样。当然,理疗师知道你拉伤了哪一块肌肉,知道如何更好地保护你的身体,但是你无法让他们替代运动员上场比赛。作为我们学校一名计算机科学专业的学生,当然,我学习了计算机语言的结构和解释,可是我从没有听过“前端工程师”或“全栈”这些词。架构设计是什么?从没听过Xcode,git是不是用来确保你的同伴可以访问你已经写好的代码的?框架?你是否只需要HTML和JavaScript?API到底是什么鬼?
一个接一个的招聘岗位要求iOS或Android编程经验,或者自己设计的网页清单。这些我一样都没有,坦率地讲,我甚至不知道该从哪里开始。我没有出生在一个科技背景的家庭,我爸爸还不会打字。我怀疑我的兄弟们是否精通什么技术。我妈妈仍然在等我放假回家给她MP3里拷贝新的音乐。我可以在网上选几个教程,但我如何能弥补我与那些人的差距?那些上过科技高中的人?或者他们父母都是搞软件开发的人?或者那些有自己的服务器的人?还有那些7年级就黑了自己中学电脑系统的人?我要怎么和那些有科技特权的人竞争?
我找了一个和计算机科学不相关的工作。建议拥有Bash的知识,但是不强求。更坏的是,我放弃了这个工作。我的Python编程经验让我能够胜过那些IT咨询台岗位的应聘者。我经历过帮助老人用电脑。我至少应该找到一个工作,那才像样。
剧透:我有一份谷歌的工作邀请。
在我大四那年的九月中旬,所有事情都开始改变了:不知怎么,我成了上面说过的那些人的朋友。
最初我没把这位朋友放太当回事。我第一次见他,他正在编写代码挖掘Craigslist中所有免费的家具的列表(顺便提一句,这是违法的)。那时候,我甚至不知道数据挖掘是什么。之后碰到了黑客松(hackathon)。我一直想去,但是我一直没有参加过的朋友,而且我无法自己参加。我什么都不懂。谁愿意带上一个像我一样没用的人?但是我还是害羞地问我这个朋友是否能带我去——只是旁观——了解到我将会对他们完全没用——他笑了,说他明白,然后我们就去了。
他是我脑海中一个有能力的黑客的最佳例子。最牛逼的是,他用从没用过的工具把各种东西组织到一
起。是的,他在网上搜索花的时间比他写代码的时间多,但是通过网上搜索和之前对这方面的基本了解,他完成了一个相当复杂的App。他知道Twilio属于哪一级,知道在哪里应用它,甚至没有之前的知识,他也能把事情办好。
我绝望了。他是怎么变得这么厉害能无中生有把事情搞定的?
我郁闷地度过了这学期剩下的时间,到了冬天,我又开始恐慌了。为了能让自己找到工作,我试着学了一些Code Academy的编程课程。嗯,还不错。我尝试做了自己第一个网页,很糟糕,只有一个静止页面,满是盒子和恶心的配色,不过也算回事。我明白了,就像我的那些编程好的朋友,当我遇到问题的时候,我所需要做的就是……谷歌一下。
“如何在CSS中把一个div居中?”“如何在HTML中平铺背景图片?”“如何链接一个PDF?”有时候一个很简单的问题要花好几个小时才能搞定,但是我开始明白答案就在那里。所以我继续坚持这样做。没过多久,我已经足够自信地开始尝试做小项目了—从我们学校网站挖掘数据制作一个自动平均成绩计算器。哈哈,我成功了!还不懒!对吧?就像这样,我开始一步一步自信起来。
一点建议:如果你刚开始编程,我建议你从JavaScript/HTML/CSS开始,因为网上有很多关于他们的帮助文件和问答。你很可能发现网上有人已经完成了你想做的事情。还有,完成几个在线课程吧。即使他们看起来没什么效果,最起码他们能教会你那些你谷歌搜索时候必须要知道的名词。
受到这次小小成功的鼓励,我召集了一群志同道合的同学(同样没有软件开发经验的朋友)一起参加我的第二次黑客松。就在这里,我再次顿悟了:原来我懂得比我的朋友多。突然间,我成了一个专家。我可以掌握这门语言,我知道需要做什么,知道事情应该朝哪个方向进行。距离我随机做了几个在线课程仅仅过了两周,人们已经开始认为我比他们更能干了。当然,我离那些真正有能力的朋友还差得很远,但是我慢慢开始明白,我与他们的差距也许正如我同学与我的差距一样。
真的,就是这样!
我在一个软件开发公司参加了一个暑期实习。我对我的编程能力比之前更加有信心了,但是我需要确信我具有了能以此为业的能力。因此我捡起了iOS开发、Ruby on Rails和Angular。我可以让蓝牙设备在手机上进行各种操作。我熟悉了git,与Cordova进行了亲密对话,学会了Heroku,我甚至涉猎了一些Android开发。然而最重要的是,我知道经验固然重要,却不是全部。差距不是无法克服的,因为我可以学习。
说真的,如果没有软件开发的知识我也许同样能够通过谷歌的面试。一个扎实的计算机科学知识背景是他们所想要的,我的学校给了我这些。但是我从来没想过去谷歌应聘。显然我没有那条件。
我花了很长时间才明白,我错了。
成为一名软件开发者的壁垒是真实存在的。生于软件开发家庭,或者很早就接触编程的人们具有这样的自信:这让让他们乐于处理新鲜事物并保持学习。而在我们眼里,他们只是变得越来越强。去年,我看到了这个差距,我放弃了。但是我们所需要的仅仅是不要绝望。重要的并不是我们已经知道的,而是我们应该如何学习。是那种一直坐在电脑前想办法解决问题的坚毅的精神、是仔细研究每一行代码知道你明白是怎么回事的态度,是关于搜索方法、例子和错误,直到一切开始变得有意义的过程。
剩下的东西,自然会来到。