十年菜鸡学习回顾——第一章重温《程序设计》

文章目录


前言

谭浩强,熟悉的名字,大学教程里印象深刻的作者。计算机专业应该会必学他的《C语言程序设计》了吧。今天重新来读这本书,记录一些心得体会。

下面没有技术内容,都是一些个人认知理解的东西。不成文章,随便记录。


一、C语言的影响

C语言对行业发展的影响很重要,具体重要到什么程度?目前什么阶段?我也没研究过,对于菜鸡程序员的我,应该也还不需要那么深入了解。

总的来说,它对我很重要,或许因为是教材,没有办法,只能受它的影响。第一次接触“程序”的概念就是从这里开始,是启蒙,也是基础。

到现在我还是觉得C语言是最好的语言,一本会,万法通。学完C语言,学习C++、C#、VB等微软系的语言,得心应手。就算是在学习Java的时候,也有同样的效果。

很多导师、或者前辈都会说,不同语言是有差别的,甚至你用C++的内存回收用到Java中来,就有可能成了灾难等等的各种各样的问题。但总的来说,老师想要教导我的,应该是如何学习,并不局限于这个语言。

其实我想说的是,师傅领进门,修行在个人。C语言是老师将我领到“程序设计”的大门口的路标。这个路标很好辨认,至少比别的路标容易被接受。谭浩强老师只是用了当时最好的C语言将程序设计讲的通俗易懂。并且算是普及了工科所有专业了吧,毕竟都要二级证书。

普通程序员不应该拘泥于语言本身,对于大多数程序员来说,业务代码、业务逻辑才是日常生活。

语言本身熟能生巧,应付一般工作、在一般工作中淬炼,再怎么不学,都能知到怎么使用了。语言种类繁多,但好的设计思维万里挑一。

这里的设计涉及语言本身的设计,这是大家区分语言“优劣”的主要指标,类似python、java、c等,经常用来做比较。其实我个人感觉,并不需要比较,他们的优势、主要使用场景都不一样,其实就一句话:见人说人话,见鬼说鬼话。刚好人话鬼话有某些地方存在共性。

在你还没有权力选择使用语言的情况下,就必须适应并掌握需要的语言。当然,全栈是限制创新的,但是对于我这样的菜鸡程序员,并不需要什么颠覆性创新。需要的仅仅是通过一个或者多个编程语言,通过创造性的程序设计,尽量实现甲方想要的绚烂的黑。

讲偏了,做个小结吧。

C语言是前辈,按照谭老师的书中的描述,掐头去尾摘出一段:限制少,灵活性大,功能强。

许多高级语言的设计,都是参考C语言的语法标准、甚至原样照搬的。因此,C语言是构建程序设计思维的很好的一个理想载体。


二、程序的灵魂——算法

1.什么是程序

书本中有很明确的定义

教材认为:

              程序=算法+数据结构+程序设计方法+语言工具和环境

这 4 个方面是一个程序涉及人员所应具备的知识。

这4个方面都是程序必备知识,每一个都是一门繁杂的学科,普通程序员来说,精通其中一个,就可以作为一生的事业。然而现实情况是,绝大多少工作机会中,并不能允许我们可以专研某个技术。那是研究员或者是吃饭不愁的高人才去做的事情。

普通程序员,都要学习。比较幸运的是我们只需要会运用、部分运用其中的优秀成果就好。但这也很难。在这里挣扎的写一堆废话,就算要提醒自己,需要静下心来,真正的去学习,怎么样才能“会运用”。如果需要延续自己的职业生涯,就得不停的学习,纵然是各种懒癌附生,嘴上也要说一说,毕竟已经花费了10年的青春。

忽然感觉“程序员”很伟大,是勤勤恳恳的搬运工,每天都在辛勤的采蜜,尽管这个巢穴的位置不是它定的,需要采什么花也定不了,就那么的按照说明书,一步一步的作业。

亦或是工厂流水线工人,专心的按部就班拧着螺丝。

我想说,程序的概念,应该改一改,要有点人情味。

我认为:

              程序=程序员+算法+数据结构+程序设计方法+语言工具和环境

谁来搭建这个程序员?有钱的“老板”。

2.算法的概念

通常潜意识里,算法的概念非常高大上,经常网上看到各种算法工程师、算法大神。是的,那确实是算法。这里回归本质。书中对算法有一个定义:

做任何事情都有一定的步骤。为解决一个问题而采取的方法和步骤,就称为算法。

计算机算法:计算机能够执行的算法。

计算机算法可分为两大类:  

        数值运算算法:求解数值;

        非数值运算算法:事务管理领域。

看起来,只要是程序员,都是“算法工程师”的。不管是解决事务管理领域问题还是解决数值运算问题,都是在解决“问题”,程序的作用,就是解决问题的,要么是直接解决,要么是间接解决。

人类发展中的各种工业革命,主要的目的,是在提升效率这个根本问题上。算法工程师的存在,应该是因为普通工程师已经解决不了效率的问题,需要细分工作,需要在数学家和程序之间,搭建一个友好的桥梁,让数学家的理论得到应用。

突然想到任正非说过一个俄罗斯数学家的故事。我同样很崇拜和这位数学家一起工作的算法工程师大牛。

普通程序员的我要做什么呢?

第一步:背书!!!背书!!!背书!!!要运用知识,运用前人的优秀经验和成功设计,就得先“继承”,得在面试题前起来得心应手,记住,绝大多数考的算法题,都是求解数值

第二步:举一反三,好了,搬砖的时候,视乎是可以用上了,用上了有什么被表扬的吗?现实情况是:并没有。通常情况下,绝大多数非核心代码,不是你开发。并且在老板看来,你在浪费时间去研究这个不能提升多少效率,反而增加沟通成本,和产品撕逼,导致项目死掉了。

是的,你没有看错,说的就是死掉了。现实情况很复杂,但是这个是矛盾之一,普通程序员的算法经常使用的是事务管理领域,在解决业务问题,通常情况下和用户诉求是有矛盾、冲突的,撕逼在所难免,如何权衡、解决好这类事情呢?妥协!没错,一个优秀的菜鸡躺平程序员,就要有躺平的觉悟,有点尊严的妥协。

第三步:普通人没有第三步。

 

三、程序的基本结构

从程序流程的角度来看,程序可以分为三种基本结构, 即顺序结构、分支结构、循环结构。 这三种基本结构可以组成所有的各种复杂程序。 

 

反反复复,折腾来折腾去,都在这里面绕来绕去,不要觉得疲倦,因为已经习惯。是那种不知道为什么这样做的——习惯(本来就是这样)。

规则如此,不哆嗦。

现代计算机的程序,是要在图灵机上运行。如何高效、正确的运行?前人已经打下了地基,这样的方式就是其基础上的最优方式,或许将来会有更高明的(除非真摆脱了图灵机)方式,当然不是我所能遐想的了。但是作为一名菜鸡,需要有自知之明。

简单来说,程序的代码,将会被编译器编译为机器指令,由计算机进行执行令并得到结果。如何让编译器识别人的意图?曾经汇编课老师经常说,他们那个时候,是用打孔机在一张长条的纸上打上一堆孔,拿到机器上读。。。。

现在,创造了各种“高级”语言,让人们更加容易高效的的编写一定规范的“代码”,主要是为了让编译器能够识别并且转化为指令操作计算机。其本质上并没有太多出入。

 什么面向对象设计、什么算法设计、什么设计模式等等,只要是在敲代码,敲的都是这三个结构。

各种的知识、设计等等,就是为了敲好这三个结构应运而生的。


总结

这本书全文正文通读了一遍,是的,只是通读了一遍。感触蛮多,文中描述的,要么遗忘了,要么之前就没有去思考过。这类些下几个有点意思的认识,证明我重温过,并且开始学习计划了吧!

重新通读一遍的感觉和曾经学习时的感觉非常不一样。突然发现真的是为了应付考试。

很多时候,既然没有办法必须去做、去看的时候,为何不欣然接受,并且能从中获取最大的利益呢?估计就是我的劣根性了,通俗一个字:贱。

还是需要多读书,尤其是专业书籍。尤其大学的教程,有时间还是需要多回去温习,虽然不能给到那么直接的工作需要的现成的一手资料,但是我觉得,这些书籍或许能给我们一些思考,基础的恰恰才是原理的出处,很多恍然大悟,就是理解了本质,才发现设计的意图(真TM原来因为这样才这么搞的呀?害我死记还用不好)。

重温过去,是一种学习经历时的复盘,学习经历的复盘或许更容易提升认知。人的精力有限,回头看看,或许会更加精进也说不定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

底层弱鸡程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值