关闭

程序员必须要会算法吗?

标签: c语言算法数据结构
1422人阅读 评论(2) 收藏 举报
分类:

编程之路

自己是在大学的课堂上开始学习编程的,最早学习的是C语言,全系英文授课,而且常有上机实验,过程极为痛苦。到学期中的时候,自己还是学的一塌糊涂。

感觉到这样下去期末肯定挂,于是便到图书馆借了几本经典的书连同教材一同钻研。那个时候自己还没有笔记本,因此需要经常到学校的机房去练习。写完的程序就存在邮箱里,自己给自己发一封邮件。一直到现在,自己的邮箱里都保存着数十封的邮件。

慢慢的开始觉得无聊的编程开始变的有意思,因为它是有规律的,一组输入就必然有着严格的运算结果与之对应。但现在看来,那时学会的基本都是如何查找字符串、斐波那契数列的递归实现等等,只求实现,不求效率。

到后来,又学习了VB的课程,有界面的程序比起黑洞洞的控制台程序看起来要高大上的许多。于是按钮、编辑框、文本框、复选框……等等,这些在当时认为“极先进”的东西不断的出现在自己的程序中,成为了自己编程时的标配。

也是从VB开始,Java、Python、LabView、JS、C#也都学习过,但大多都是工程需要,属于蜻蜓点水般的学习,而且大多伴随着”哪种编程语言强大好用的选择恐惧症中”。但真正学的比较多也应用的比较多的是MFC的编程,这主要是在《VC++深入详解》的指导下进行的自学。这本书虽说是针对VC6.0的老书,内容有些过时,但细致的分析使得写起程序来容易,边写边操作,让自己很受益。

(jie)(chu)了这么多编程语言,得到的结果却是更加迷惑的自己。每学一门语言,试验着别人的代码,大量的做着重复的事。自己编程的目的这是这样吗?


另一个世界

最近面临着找工作的压力,开始读有关数据结构、算法设计之类的书,并在Leetcode上刷题。在这个过程中,我像发现另一个世界般,学到了不一样的东西——链表、栈、队列、树的遍历、图的连通、字符串查找……等等。特定的结构,高效的算法时常让自己感叹“神奇”。

但同时自己也有着疑问:这些都是一名程序员所应学的吗?哪一门语言没有提供现成的经过千锤百炼、无数次优化的数据结构?哪一门语言没有提供性能优良的基础算法?为什么我们要去学习如何设计数据结构和基础算法?

就是这“为什么”让自己很苦恼。在网上搜索,见过的最有意思的一个回答来自知乎——

程序员要不要会算法等同于搬砖要不要学物理。

说的好有道理,我竟无言以对。因为很形象,让我记忆深刻。在贺利坚老师的博客下写了自己的疑惑,第二天的回复如下——

一条一条的汽车生产线,在各个厂家都已经建好了,是否我们都只去学开车,而不需要有人去学造车了?一样的道理,学习算法设计,(1)有人就要去为算法大厦添砖加瓦的,尽管这座大厦永无完工之日;而(2)有些人,会发明新的语言,为这种语言中配备算法“基础设施”;(3)有些人,深谙算法之道,借此理解函数接口中能体现出的道道,将别人提供的算法库用得恰到好处。而对算法一无所知的人,宝藏就在那里,却总是牵是附会地使用,做出漏洞百出的系统。所以,如果在求学阶段,不要放弃对算法修养的追求。

之前的所有自认为的“编程”只不过是在完成某个特定的任务,而不是着眼于一类问题。而数据结构和算法设计的目的在于解决一大类的问题。你写一个for循环、swith case 语句等,是在编程;你写一个树的遍历、图的连通判断算法等也是在编程。不同的是前者对一个具体的问题是适用的,而后者对一类问题是适用的。对于具体的任务,你可以用不同的语言来实现;但对于一类问题,总有着近乎相同的核心结构或者算法来应对。

最近这段时间读到的这些书、学到的这些算法才使我真正的感觉到编程的博大,而不是几个按钮、几个控件那么简单。真正高大上的是简洁高效的源代码。

避免陷入编程语言的纷争,立足于当前掌握的C++,去接触学习弄通所有相关的算法。这是自己的思考结果,也是将来的方向。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32687次
    • 积分:542
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:2篇
    • 译文:2篇
    • 评论:10条
    联系方式
    文章分类
    最新评论