分享

编程改变了我的命运——文科生编程之路

 长沙7喜 2018-04-18

编者注


这期邀请到的主讲嘉宾煜豪,本科文科毕业,在美国攻读计算机专业研究生,最后在硅谷成功求职成为一位软件工程师。在与他沟通的过程中,小编感觉到在成年时起步学习编程与在少年时开始学习编程,两者之间存在着巨大的差异 。下面是这一期嘉宾的个人经历和建议。

自述

2014年6月份我从中山大学毕业,大学期间所学专业是纯粹的文科专业。本科毕业后渐渐发现,就文科的那些知识已经不能渐渐满足我所需求的,感觉必须要掌握一门技术。正如卢梭在《爱弥儿》中所讲,“每个人都应该掌握一门技术”,所以审视了自己过去所学的种种,发现计算机反而不是毫无基础的,所以我决定申请美国的计算机专业的研究生,并转行为软件工程师。

虽然在一些技术课程中学过一些编程语言(JavaScript, html/css, R),然而这点东西实在是不够让我去申请美国的计算机专业并成为软件工程师的,所以我开始了自学编程之路。但由于不懂如何进阶,这条路走的很不顺,在弯路上走了非常多的时间。


C/C++需要童子功

刚开始那会儿,我由于不知道从哪种语言入手,所以当时到网上到处搜索。然而非常不幸的是,近乎小白的我对网上各种帖子并没有多少分辨力,结果最后就是选了一个非常错误的帖子去跟随。这帖子给予的建议是跟从谭浩强的C/C++语言课本去开始编程之路。后来看网上有很多人讨论,多少人都在讲谭浩强的课本是何等的噩梦,现在我再回想这件事,认为这个帖子的作者说少一个学习C/C++语言前提条件,那就是C/C++语言需要童子功,需要从小进行编程基础知识的训练,而对于比较急功近利的成年人未必合适。儿童受到功利主义干扰少,而成年人学编程比较急于求成,这就是少儿编程和成年人编程的根本不同,所以越是小的时候,越应该学习基础的C/C++语言,练好童子功。而对于成年的编程初学者,则应该是需要能在短时间内做出各种好玩的应用,从而可以对自己的学习产生反馈,激发更大的热情去学习编程,而不是把时间花费在深入研究操作系统,这样只会消磨掉学习的信心。


Python vs C/C++

我刚开始学那半年,所经历的痛苦可想而知,几度要放弃。到了美国读研后,跟一个专门做操作系统的朋友聊起这件事,他就直接讲初学者就应该把时间都放在代码逻辑上,远离一切和底层打交道的事物,而且他高度推荐python,说像CMU这种计算机强校,计算机本科大一新生的第一门语言就是python而不是C。学习一门脚本语言,可以让初学者摆脱对底层语言的恐惧(C/C++),这也是我通过很多案例真实验证过的 。我在美国读研究生期间做商学院的python研究生课助教,这两年由于AI的迅速发展,python几乎成了每个学科的人都要掌握的语言。在教学实践中,我们不会花太多时间上去教学生python的语法知识,而是直接让学生花一周去code academy(https://www./)上去上一门python的操作课程,一周之后我们就要求学生去写爬虫,然后用python对文本内容进行情感分析,结果发现每个学生都可以做的非常棒。与此同时,由于python简单易学的语法,可以借此迅速开始算法之旅。

不过以Python入门也有一个坏处,就是习惯了宏观的逻辑思维,对一些需要精细化设计,追求极致效率的程序,就显得力不从心。所以,习Python者容易形成舒适区;虽然习C/C++者痛苦,但是思维精度会大大提高。


Java vs C/C++

在学习了半年多C语言后,跟很多已经在美国读计算机研究生的同学聊起来我的境况,他们指出我适合作应用型的开发,而C/C++是属于比较底层的核心软件开发语言。为了快速具备应用开发能力,他们建议迅速切换到Java上,熟悉Java的数据结构和面向对象,并开始进行算法知识的学习。在美国,算法是软件工程师必须掌握得非常熟练的知识,因为几乎每场找工作面试,必然会有算法题在这里让你解决。不得不说,算法对于我则是另一片天地。仍然记得那会儿为了理解recursion,在IntelliJ上设上断点,一层一层的研究所经历的每一步。然而没这种愚蠢的处理,我在后面也是不可能很熟练地理解如何写recursion rule和画recursion tree的。而最折磨人的大概就属动态规划了吧,在推出通项公式之前,大概就只有一片黑暗。当初刚接触这部分时,真是不知道该如何下手,只能在网上到处找资源,这次比较幸运的是,根据YouTube的相关资源浏览量,我看了Tushar Roy讲解动态规划题目的视频,他真是个非常好的讲解者,用填图表的方式去解决动态规划这类问题,这不仅让人可以一目了然每一步都要怎样走,也可以让人很快就推导出通项公式。

编程实战和硅谷求职

在掌握的语言之后,我就开始琢磨着如何去拓展对这个语言的理解,做一个实战项目成了我要走的下一步。但选何种项目成了一个难题,我就围绕着这几个问题去思考该如何去选一个日后可以拿得出手的项目:1.什么技术架构能够吸引你的面试官;2.无数的公司需要,大部分的工程师每天做的事情是什么;3.哪些技术最多出现在Job Description里边?综合这些思考之后,我发现做一个Event的推荐系统成了一个很好的选择,如何实际设计和开发推荐API,如何设计内部的搜索系统,如何进行后端服务和数据库的开发,都是我亟需练习的。也是因为这个项目,开始了我做全栈开发之路。

讲了这么多个人进路,也总该有些针对成年初学者的详细建议了吧。后面有三部分,前两部分较详细,至于最后一部分大概就不需要这么详细了,因为已经走完第二阶段的你,相信是可以自己去走后面的高阶之路的。


1.启蒙阶段(零编程基础)

1

学习一门脚本语言python或javascript。实践项目有:

①处理txt或csv文件,学会使用python下的几个package去读一个本地文件,例如csv, open, sys这些,可以做一些word count的工作

②可以用python跟数据库打交道,mysql或sqlite,可以用脚本文件去统计数据库里的条目

③用python去遍历文件系统,可以编写脚本文件去统计一个目录下的所有文件大小

④可以熟练使用print或assert这种粗暴的方法去调试

2

熟悉使用Unix/Linux命令行:

①避免对图形界面的依赖

②学会用man来查看帮助

③文件系统结构和基本操作:cd/ls/chmod/chown/mkdir/rm/find/cat/mount/tar

④学会使用文本操作命令:sed/awk/print/head/echo/less/more

⑤学会使用管理命令:df/lsof/kill/ps

⑥知道/etc的配置文件,知道如何从/var/log查阅系统日志

⑦regex和wildcard

⑧熟练使用vim的各种快捷键

3

学习lamp stack和web基础:

① 学习html/css

② 学习如何配置一个apache server

③ 学会使用php,了解什么什么是get,什么是post

④ 学会javascript和ajax,知道如何parse json数据格式

⑤ 学习数据库(MySQL)基础知识

⑥ 附带学习git和github的使用

2. 进阶阶段

(懂脚本语言,shell编程和web基础)

1

学习Java(面向对象+数据结构):

①了解何为jvm,试着比较java, c和python在编译和执行上的区别,思考何为跨平台

②熟练掌握面向对象的要领,熟悉8种常见的数据结构在java中的使用,并能够自己实现这些数据结构

③熟练使用IntelliJ或Eclipse去编译,调试和开发java程序

④用Tomcat做server,把php的项目用java servlet去重新实现

⑤了解垃圾回收机制,了解异常

1

C语言学习,这部分主要是为了学习操作系统准备的:

①理解指针和内存模型,知道C语言的内存管理

②理解多线程和多进程,并可以用c语言去实现

③socket编程

1

算法学习,程序员找工作必然会面到的一部分,不论是新手还是专家

①Sort

②Binary Search

③recursion vs iterative

④graph (dfs or bfs) vs tree

⑤Dynamic Programming

⑥String vs Array

⑦Advanced Data Structure

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多