程序员必须要会算法吗?

原创 2015年07月09日 22:50:35

编程之路

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

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

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

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

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

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


另一个世界

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

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

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

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

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

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

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

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

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

相关文章推荐

程序员必须要会算法吗? 获奖名单公布

活动主题 程序员对算法通常怀有复杂的感情,算法很重要是大家的共识,但是是否每个程序员都必须学算法是主要的分歧点。程序员必须要学会算法吗?这是一个永恒的话题。 很多人可能觉得像人工智能、视频与音频处...

程序员是否必须会算法

提到“程序员与算法”,就必然要涉及一个基本问题,那就是“程序员是否必须会算法”。这是一个充满争议的问题,虽然并不像“生存还是毁灭”之类的选择那样艰难而沉重,但也绝不是一个轻松的话题。朋友们在我的“算法...

优秀程序员必须知道的32个算法

  • 2015年10月24日 20:25
  • 32KB
  • 下载

Android 程序员必须知道的8个算法及其时间复杂度讲解

插入排序的中心思想:插入 选择排序的中心思想:取第一个值 冒泡排序的中心思想:交换 归并排序的中心思想:分治发 插入排序的中心思想:插入 ...

程序员必须知道的十大基础算法及其讲解

算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速...

04_程序员必须掌握的8大排序算法_堆排序

堆排序基本思想 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆的定义如下:具有n个元素的序列(h1,h2,…,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi...

程序员必须知道的10大基础实用算法及其讲解(Javascript代码实现)

注:本文的文字解释部分并非原创,

程序员必须知道的10大基础实用算法及其讲解 (来自cricode.com)

算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速...

程序员必须知道的10大基础实用算法及其讲解

fromhttp://mp.weixin.qq.com/s?__biz=MzA3 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下...

06_程序员必须掌握的8大排序算法_快速排序

快速排序基本思想 选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员必须要会算法吗?
举报原因:
原因补充:

(最多只允许输入30个字)