⭐ 本文已记录在了我的个人博客,欢迎访问:https://www.zhulang.love
大部分刚进入大学的小伙伴们应该是第一次接触编程,编程世界广阔而复杂,对于初学者来说,很容易感到迷茫和不知所措。小伙伴们可能会充满许多疑问,例如怎样才能学好编程、编程的学习路线是什么、哪些人适合学习编程、有哪些好的学习方法等等。对此,我在 2022 年为 软件协会 大一成员 初次编写该指南提供帮助。在 2023 年,我在编写的 2022 年指南基础上进行了重新排版与内容优化,为初学者提供更好的学习指引。
我在刚上大学时才开始接触编程,关于电脑也只会玩玩 4399,其它一窍不通。因此当时的我也是一名正宗的编程与电脑初学者,刚接触编程的时候也是非常迷茫甚至慌张的。
在这篇指南里,我对当时小白的我遇到的问题进行了解答,并汇总了 2022 年的大一新生遇到的许多疑问的详解。因此,这或许会成为一份不断更新的指南。
当然,这只是一个已经学习了两年编程的学长的经验分享,不是大佬或专家的专业解答,但可能会因此更加易懂与有实际的帮助,让你得到实在的收获。
官网:https://www.csuftsap.cn/
中南林业科技大学软件协会成立于 2018 年,一届又一届的学长学姐都在用他们的努力为其添砖加瓦,他们乐于将自己的经验和知识传承下去,为新一届的成员提供宝贵的指导和鼓励。因此,软件协会的发展是迅速的,离不开历届学长学姐的努力与社团成员的认可支持,从 2018 年只有十几人的小社团发展成了 2022 年吸引了近三百人加入的大社团。
软件协会的优势:
学长学姐学习指导与解疑答惑;
优质资源分享平台;
知识拓展:软协提供的知识拓展大部分都是在学校学习不到的,但却是在实际工作开发中用到的知识与工具。软件协会对大一社团成员的学习规划是在与其他学校同学学习同样知识的基础上进行知识巩固与超前学习;
书籍资源,提供借阅;
丰富多彩的活动:例如暑寒假学习小组、软件开发大赛等等。
很多有所建树的人在分享自己过往的时候,一般都会说自己是个幸运的人,但其实很多的运气都是来源于他前期的准备和努力的工作,所以如果我们经常在说自己运气不够好的时候,需要想想自己是否真的努力过了,因果关系要弄清楚,不是运气来了你再去努力,而是越努力的人往往才会有好运气。
如果你是正在恋爱的人,别在意有没有海誓山盟,也别去期待感情一定会开花结果。重要的从来都不是把注意力放在不切实际的远处,而是把信念放在心中,好好珍惜此刻的拥有。除非结果真的发生,不然永远没人知道会发生什么。当你不再期待结果,结果才会真的发生。所以,放轻松,把念力放在心里,它会领着你去往你该去的地方。你呀,别管那个地方在哪里。
如果你是已经分手的人,愿你们在分开过后的漫长岁月里,偶尔也能怀念起彼此,心生欢喜和美好;愿你们在无法重来的未可知的将来里,因为已经足够幸福,而不再彼此想起;愿已经深爱过的你,能在人生的别处得到眷顾。
如果你是单恋的人,希望无论对方给你的回应是什么,你都能从这样的一段关系中得到比你孤独一人时更多的快乐。
如果你是被真心喜欢的人,希望无论对方是不是真的符合你的择偶标准,你都能在被真心对待的时间里善待那个人。
最后,我们谁都无法被所有人喜欢,遇见能看到你的美好并爱上这种美好的人,本来就不容易,本来就值得我们感恩和珍惜,不是吗?
我们应该真正地把低调平和当成我们做人做事的习惯,我们要对周围的人,无论强者还是弱者,都同样地给予尊重和真诚。没有人会是常胜将军,也没有人会永远都是被同情的弱者。如果你今天站在了相对较高的位置,那么你就应该拿出你强者的姿态,这种姿态不是高高在上也不是恶语相向,强者的姿态应该是“以弱者的姿态,做出强者的举动”。
如果有一天你不小心滑落到了低点,你希望别人用怎样的目光看待你,你希望别人用怎样的态度与你交往。那么,就应用你希望别人对待你的方式去对待你身边的每一个人。
希望没有被这个世界温柔对待的我们,能默默地在自己的身体里创造出更多更多平和的力量;
希望我们都能成为,站在人生低处的时候不心灰意冷不焦躁抱怨,能够勇敢地掸掉泥土从头再来的人;
希望我们都能成为抵达人生高处的时候也会收起尖锐与刻薄,懂得宽宏与分享的可爱的人。
希望我们能骄傲地活着,不畏惧任何困苦和折磨;
希望我们能柔软地活着,不刺痛任何难堪和脆弱。
我们通过有固定格式和固定词汇的“语言”来控制他人,让他人为我们做事情。语言有很多种,包括汉语、英语、法语、韩语等,虽然他们的词汇和格式都不一样,但是可以达到同样的目的,我们可以选择任意一种语言去控制他人。
同样,我们也可以通过“语言”来控制计算机,让计算机为我们做事情,这样的语言就叫做 编程语言(Programming Language)。
编程语言是用来控制计算机的一系列指令(Instruction),它有固定的格式和词汇(不同编程语言的格式和词汇不一样),必须遵守,否则就会出错,达不到我们的目的。
可以将不同的编程语言比喻成各国语言,为了表达同一个意思,可能使用不同的语句。例如,表达“我爱你”的意思:
printf("我爱你");
cout << "我爱你" << endl;
System.out.println("我爱你");
这些具有特定含义的词汇、语句,按照特定的格式组织在一起,就构成了 源代码(Source Code),也称 源码 或 代码(Code)。
// 这是一段 C 语言的示例源代码,作用是打印 Hello World
#include
int main()
{
printf("Hello World");
return 0;
}
那么,C 语言肯定规定了源代码中每个词汇、语句的含义,也规定了它们该如何组织在一起,这就是 语法(Syntax)。它与我们学习英语时所说的“语法”类似,都规定了如何将特定的词汇和句子组织成能听懂的语言。
编写源代码的过程就叫做 编程(Program)。
从事编程工作的人叫 程序员(Programmer)。
程序员也很幽默,喜欢自嘲,经常说自己的工作辛苦,地位低,像农民一样,所以称自己是”码农“,就是写代码的农民,也有人自嘲称是”程序猿“。
自称码农的程序员并不见得能容忍其他人这样称呼自己哦,类似于自己调侃自己是“舔狗”、“屌丝”、”靓仔“没问题,但不见得希望别人这么调侃自己。
身处现如今的互联网行业,程序员工作辛苦,加班再正常不过,项目进度、突发情况、公司文化都可能成为加班的理由,虽然收入不一定差,但够苦逼。另外一方面, 程序员鱼龙混杂,水平参差不齐,而互联网向来是一个强调能力的开放行业,有多少能力就拿多少工资,这样注定有相当大一部分因为水平不够,导致收入问题成为码农们的心病。
所以,你要加油,等到她来的时候,一定要抱紧她。告诉她,“来了,就别再走了。”
编程是一门技术,对不同人来说这个难与不难的标准有所差别。但我知道,只要你愿意去学,愿意去花时间与心思,是肯定能学会的。每个人的思维逻辑水平有所不同,兴趣点不同,有的人可能学起来吃力,有的人觉得容易。
什么是逻辑水平?我举一个有趣的例子,大家思考下如何将大象放入冰箱?
如果你能理解以上这个步骤,就能解决五分之一你会在编程中遇到的问题了。
值得注意的是,任何一门编程语言都是有都是有道理与规律的,我们要在学习的过程中去摸索。老程序员们总是会告诉新手一定要认真学好一门编程语言,再学其它编程语言时会变得很轻松。这是因为不同的编程语言之间通常有通用的编程概念和基本原理,只不过是语法和用法或许有所不同。
知识点可以在短时间内了解,但是思维方式和编程经验需要不断实践才能强化,这就是为什么很多初学者已经了解了 C 语言的基本概念,但是仍然不会编写代码的原因。程序员被戏称为”码农“,另一层意思是写代码的农民,要想成为一个合格的农民,必须要脚踏实地辛苦耕耘,去亲手把代码敲一敲。
不要压力太大噢,一切编程语言都是纸老虎,一层窗户纸,只要开窍了,就容易了。
很多初学者认为,编程语言是由英文组成的,而且会涉及很多算法,自己的英语和数学功底不好,到底能不能学会编程呢?
首先我们得明确,学习编程需要你有英语基础;但是,要求并不高,初中水平完全可以胜任。
编程语言起源于美国,是由英文构成的,其中包括几十个英文的关键字以及几百个英文的函数,除非需要对文本进行处理,否则一般不会出现中文。但是,它们都是孤立的单词,不构成任何英语语句,不涉及任何英语语法。
就我个人这个英语菜鸟而言,百度翻译 已经成为了我编程生活的必需品了。
但是,如果你希望成为非常非常顶尖的“大神”,就必须有比较好的英语能力。虽然现在中文的技术文档、博客、论坛也很多,不懂英文也是能学会一门编程语言的。但是你要明白很多编程语言的官方文档、源码注释都是英文的,很多前沿的技术也是英文的。不去阅读英文的文档很多精髓无法领会,翻译的有些也是不准确的。
编程语言确实涉及到很多算法,有一些还需要高等数学知识,但是,这些算法都已经被封装好了,你直接拿来用就可以,根本不用你重复造轮子。
什么是“造轮子”:这个术语是一种比喻,“轮子”在编程中一般指由程序员写的功能、库、组件或者说框架,我们会将其它程序员写的优秀的“轮子”加入到我们自己的项目中,来实现某些功能,从而节省自己的时间和精力。
你需要知道算法设计者都是顶尖的大牛,我们这些绝大部分平凡的人类是没有能力去创建一个优秀的算法的,只需要去学习他们发明的算法并应用就行,即使你看不懂,随着时间的累计很多你都可以选择去直接记住。
但当然,这些优秀的数据结构与算法都涉及很多巧妙与复杂的逻辑需要你去理解,想要学好数据结构和算法,这是一个需要长期学习的过程,每个人都是需要如此。
另外,这些算法都是在很深的底层为我们默默的工作,初级程序员根本不会涉及到算法,即使是别人已经封装好的算法,一般也没有机会使用,我们直接调用就可以了,所以,你就别瞎操心了。
我在一个论坛上看到一位顶尖的开发工程师(后转架构师)在谈到这个问题说,“我学编程八年了,至今都没有设计过什么真正的算法,大部分底层都给我安排明白了。
不需要。在我们未来的职业生涯中,我们绝大部分人只需要掌握一门编程语言即可,每门语言都有广泛的业务范围。
需要明白的是,想要把任意一门编程语言学好都需要花费很长的时间,即使已经有了许多年工作经验的老程序员也依旧要抽出时间对自己从事的编程语言进行深入学习。我们都没有精力去把每门语言都吃透,否则到头来你只是对每门语言有个大概了解,和别人聊起来,一旦涉及到更深入与底层的东西,你就会无所适从。我们绝大多数人是平凡的,脑子里可以装的东西是有限的。
这就好比你想做一个渣男,想做到雨露均沾,但努力了很多,才认清自己不是土豪,给不了所有女孩一个家。
我认为的是:
比如 C/C++
适合去做底层开发、游戏、游戏引擎等,Java
适合去做 web 应用、安卓、大数据等,Python
适合去做人工智能等,PHP
适合去做网页开发等,Go
是区块链的主力开发语言。学习任何一门语言都需要十几年内功的积累,因此你必须要知道你到底对什么感兴趣,因为如果没兴趣这将对你来说是一个非常难熬与痛苦的学习过程。
举两个大家熟知的软件的例子:
操作系统 Windows、Linux、Mac、Android 均由 C/C++ 开发。
全球最大的票务交易系统——中国铁路 12306 售票系统,主要由 java 开发,需要承受亿级访问量的冲击,全国每天都有几千万人在购票。
安卓手机上绝大部分应用程序都是由 Java/Kotlin 这两种编程语言开发的。
完全不需要,就我个人的经历以为,大一上把 C 语言学好,把 编程思想 与 基础 打牢固是非常重要的。你在大一上学了 C,在以后你会发现在很多地方你都会见到 C 语言的影子。以及数据结构和算法的学习我们更推荐使用 C 语言来训练,因为 C 语言是最干净纯粹的通用经典计算机语言,可以极大帮助我们一拳一脚地养成规范的动作习惯。
和 Java、C++、Python、C#、JavaScript 等高级编程语言相比,C 语言涉及到的编程概念少,词汇少,思想也简单。C 语言学习成本小附带的标准库小,所以整体比较简洁,容易学习,初学者能够在短时间内掌握编程技能,非常适合编程入门。
其实很正常,因为是初次接触当然会有点无所适从,就像你高中学习数学,初次遇到某种类型的题目,可能有坑,大部分人都会踩进去,但第二次、第三次呢,犯错的人会很少很少了,因此学编程刷题目也是一样,先照着写、熟悉套路之后自己再练习会快很多。学习任何东西都需要一个过程,但前提是你一定一定要把自己的基础打牢。
每个程序员都是这样过来的,开始都是一头雾水,连输出九九乘法表、金字塔、菱形都很吃力,只有通过不断练习才能熟悉,这是一个强化思维方式的过程。
我记得我开始接触编程时,当需要我打印一个菱形时,我满脑子都是懵了,卡了很久也没有思路,当时难过的怀疑自己是不是不适合学习编程。
出现错误不可怕,发现错误并解决的过程是提升代码能力的关键点。你遇到一千个错误或 bug,你的能力就能提升一千点。就我个人而言,其实很喜欢修改bug 的过程,因为我加深了对这个知识点的认识,有时候也会是底层源码的了解。别人可能也会遇到同样的问题,我可以帮他点出来并解决确实能增强我学习编程的信心。
遇到问题时,一定要先自己独立思考,学会 代码调试 与 debug。如果还无法解决,可以通过以下几个途径解决:
刚接触编程的那一阶段对大部分初学者来说应该是比较困难的,因为我们之前都是跟人打交道,突然要跟机器打交道,很多思维方式就要改变。如果你没有耐心,是很容易放弃的。
特别是刚开始的时候,要去安装配置语言环境,第一次接触容易让人绝望,因为安装配置不仅仅是点点鼠标就可以了,还需要配置路径之类的,比如 Java 的全局变量配置,而这些在学习编程之前基本上不会有机会接触到。
编程语言其实就是一个工具,工具我们就需要明白怎么组装,怎么使用,如何让工具发挥它最大的性能,这整个过程就是一个熟能生巧的过程。
话又说回来,如果我们是零基础,建议千万不要看从国外翻译过来的经典书籍,例如《C Primer Plus》之类的,这些书当然非常好,但对于小白阶段的你来说只会让你睡着,没有基础的人看了只能是云里雾里,很多概念完全没办法理解。反而是国内的一些从入门到精通的书籍或者网站(例如:菜鸟网站、W3CSchool)比较合适,浅显易懂,虽然没有说的很透彻与全面,但入门足够了。
因此我个人的推荐是 先看视频,看完视频再看书。
熟练掌握一门编程语言的大致流程大概是:
完全可以。编程是一项技术,与专业无关,你只要有正确的思维逻辑就可以学习编程。
如果是转专业到计算机类的同学,在有些方面还是具有优势的。比如你以前是从金融转到计算机的,现在你的老板要你和你的小伙伴们去做一个财务方面的项目,通常你们先要去了解学习一下金融财务方面的知识,但你以前是金融的,即使你现在不记得了,但现在再次学习肯定比其他人要更快掌握,可以指导他人与更快投入工作。这时你的老大肯定会对你刮目相看。在职场上领导对你赞赏是一件很重要的事情,特别是我们编程专业大部分人都是吃青春饭的,老板的青睐意味着升值,意味着可以往管理方向走,这基本是每个程序员都希望的事情。
你不必纠结自己的专业,专业是找工作的充分不必要条件。当然,如果你是非计算机专业,却希望把编程作为自己未来就业的路,那么我强烈推荐你一定要转专业到计算机专业来,像 计科、软工、物联网、大数据 都可以。这不仅能提升你的眼界,有更多志同道合的朋友,也能让你把更多精力放到编程上来,找工作也会方便很多。
从高中过渡到大学,首先要转变一个思路。高中是学校老师教什么,学生们就学什么,这是因为我们要应对“应试考试”,通过高考这场赛事进入到各种等级的大学。而我们上大学是为了以后可以更好的就业,是到社会的各个企业中做实际的工作,所以如果在这个时候,你还是原来的高中思维,学校老师教什么,你就跟着学什么,那你就会把大学四年的时间都耽误掉。
到了大学之后,首先要明白一件事情,大学是一个平台,你可以在这个平台上肆意发挥,你想学习什么,都是可以通过自学完成。大学必须要靠自学,而不是靠学校老师教你。任何行业任何专业的技能,都要靠自己去琢磨去花时间熟能生巧。就拿编程来说,编程就是一个需要大量时间进行实践写代码才能不断进步的东西。如果你不主动自己去学习新知识,去敲代码写项目,只是跟着学校课堂老师,认认真真听完课,是根本学不会编程的,毕业也不会找到工作。
仅仅认真上好学校的课程是远远不够的,原因如下:
最后想说的是,我们现在这个时代最不缺的就是学习资料,网上有各种行业各种专业的学习资源,你想要成为任何领域的人才,都可以通过自学来实现,不需要靠学校不需要靠老师。不过好的学校会给你一个学习的平台,好的老师可以让你少走弯路。
谈到 C 语言的发展历程,就不得不从最早的二进制语言说起。二进制语言可以说是世界上最早的计算机语言,它只允许程序设计人员使用计算机能够直接识别和执行的二进制代码(即0和1)来编写程序。可想而知,这样的编码方式对程序设计人员来说是多么困难与枯燥。因此,为了提高程序设计效率并减轻程序设计人员的负担,所以后来很快便出现了 汇编语言(Assembly Language)。
与二进制语言一样,汇编语言也是 面向机器 的程序设计语言,不同类型的计算机上需要提供不同的汇编语言。使用汇编语言编写的程序机器并不能直接识别,而需要通过一种程序将汇编语言翻译成机器能够识别的二进制语言,这种起翻译作用的程序就是 汇编程序。
相对于二进制语言,汇编语言不仅使开发效率得到了很大提升,而且它还具有许多优点。尽管如此,汇编语言依旧是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码。在实际应用中,它仍然暴露了一些不可避免的缺陷。
因此,我们更加需要一种设计描述简单,能脱离对机型的要求,并且能在任何计算机上运行的计算机语言,我们称这种语言为 高级语言。这样,程序设计人员就可以将问题及解决问题的算法过程描述出来,利用这种高级语言直接写出各种表达式来描述简单的计算过程,而无须针对不同的机型编写不同的代码。
❓ C语言是世界上出现的第一种高级语言吗
不是的,世界上出现的第一种高级语言是 Algol 语言,它也可以算作 C 语言的前身。
著名的操作系统 UNIX,最早也是由 C 语言的设计者之一的 Ken Thompson 使用汇编语言所写的,再后来随着 C 语言的诞生,两位 C 语言的设计者 Ken Thompson 和 Dennis Ritchie 又用 C 语言重写了 UNIX,C 语言也伴随着 UNIX 操作系统成为一种广受欢迎的计算机语言。
补充:Linux 是一个类似 Unix 的操作系统,Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和用户体验上进行优化,由世界顶级黑客、最伟大的程序员之一的 Linus Torvalds 发明的著名操作系统,Linux 是微创新/改进了 UNIX(但并没有抄袭 UNIX 的源码),使得 Linux 在外观和交互上与 UNIX 非常类似。
对于任何一门语言,都有不同的版本迭代,存在着新特性、代码结构修改或者新标准制定。
美国国家标准委员会 ANSI(American National Standards Institute)
是制定 C 语言标准的国家机构,C 语言标准的发展历程如下:
K&R C:1978 年,丹尼斯·里奇(Dennis Ritchie) 和 布莱恩·科尔尼干(Brian Kernighan) 出版了一本书,名叫《The C Programming Language》。这本书被 C 语言开发者们称为“K&R”,很多年来被当作 C 语言的非正式的标准说明。人们称这个版本的 C 语言为“K&R C”。
在 GCC 编译器中,针对不同版本的 C 语言标准,可以通过在命令行中使用“-std”选项来选择所需要使用的 C 语言标准版本。
C 语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理。比如,计算机的各个部件是如何交互的,程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的“爱恨情仇”,这些底层知识决定了你的发展高度,也决定了你的职业生涯。C 语言没学好,后面学数据结构、操作系统、体系结果以及计算机网络等等,都会很累,因为这些都是在与计算机底层打交道,我们的操作系统 windows 和 linux 都是用 C 语言开发的。
如果你希望成为出类拔萃的人才,而不仅仅是码农,那么这些知识就是不可逾越的。也只有学习 C 语言,才能更好地了解它们。有了足够的基础,以后学习其他语言,会触类旁通,很快上手。
C 语言概念少,词汇少,包含了基本的编程元素,后来的很多语言(C++、Java 等)都参考了 C 语言,说 C 语言是现代编程语言的开山鼻祖毫不夸张,它改变了编程世界,任何改变编程世界大局的事件都离不开 C 语言。
软件行业的很多细分学科都是基于 C 语言的,学习数据结构、算法、操作系统、编译原理等都离不开 C 语言,所以你应当不难发现,几乎所有的大学都会将 C 语言作为我们计算机相关专业(物联网,软件工程,计算机科学与技术等)的同学要学习的第一门编程语言。
C语言被誉为“上帝语言”,它不但奠定了软件产业的基础,还创造了很多其它语言,例如:
C 语言是有史以来最为重要的编程语言,是计算机产业的核心语言:要进入编程行业高手级别必学 C 语言,要挣大钱必学 C 语言,要做黑客、红客必学 C 语言,要面试名企、外企、高薪职位必学 C 语言。
在学习 C 语言的过程中,编译环境和编辑器肯定是必不可少的。比如大家常见的 VC 6.0、Dev、g++ 等等,但是目前市场上使用最广泛,相对成熟的集成开发环境依旧是 Visual Studio。
只是很多高校在教学实践中普遍采用 VC 或者 Dev,因为文件小,安装便捷嘛!不过相对而言,这些软件对初学者往往不够友好,包括界面、提示符、文件系统等等。
而与之对应的,VS 凭借它出色的界面、友好的操作方式和完备的体系得到很多开发者的青睐,所以也是奉劝一些仍在坚持学校的软件的小伙伴们入坑 VS,只有四个字送给你们:绝对不亏!
VisualStudio 安装教程:https://www.bilibili.com/video/BV11R4y1s7jz/
力推哔哩哔哩上的课程,其实像黑马、比特等 IT 教育机构都是非常不错的,总有人会问看谁的教学视频比较好,其实说实话,看播放量高的那几个其实都差不多,播放量高的都能说明经过了学长学姐的检验。
如果非要说一个我认为非常好的 C 语言教学视频,我比较推荐 2023版 C 语言程序设计从入门到进阶【比特鹏哥】。
无论何时都可以开始写代码!!!
你的第一个C语言程序:
#include
int main() {
printf("Hello World:你好,软件协会");
return 0;
}
Hello World 是一个最著名的程序。对每一位程序员来说,这个程序几乎是每一门编程语言中的第一个示例程序。实际上,这个程序的功能只是告知计算机显示 Hello World 这句话。传统意义上,程序员一般用这个程序测试一种新的系统或编程语言。对程序员来说,看到这两个单词显示在电脑屏幕上,往往表示他们的代码已经能够编译、装载以及正常运行了,这个输出结果就是为了证明这一点。这个测试程序在一定程度上具有特殊的象征意义。在过去的几十年间,这个程序已经渐渐地演化成为了一个久负盛名的传统。几乎所有的程序员,无论是在你之前,或在你之后,当第一次实现与计算机成功沟通之后,在某种程度上,他们的肾上腺素就会急剧上升(激动不已)。
你一定要学会做自己的笔记,无论你是用本子做笔记还是用电脑软件做笔记,都要有对知识点的总结,有在学习过程中或 编程/开发 练习中遇到的问题的思考。
随着时间的迁移,你的知识范围与知识深度都会大大提高,人的大脑能装的东西是有限的,你肯定会忘记许多曾经学过的知识。有人说我看书不就行了吗,书上讲的多详细与知识覆盖多广啊?但实际上,你所需要花的查阅成本比看笔记大的多,笔记上应当有你自己对于知识点的理解,有对需要注意的问题的标注。
当然,我更加推荐的是用电脑软件做笔记。在我的整个大一期间,我都是像高中一样使用本子做笔记,但得出来的结论是不仅花费在做笔记上的时间上太多,而且查询某个知识的效率也低下。
过去的日子里我陆陆续续用了许多支持 markdown 语法的程序员笔记软件,但兜兜转转还是回到了 Typora,我确实认为它是最好的程序员笔记工具,你值得去学习一下如何使用。
这里说的代码不要死记硬背,不是说的不要去记忆一些东西,当然还是有东西需要去记住的。比如说我们 C 语言的 int、double、float、for、while、case、switch、break 等等关键字还有 C 语言的语法等,这些肯定都是需要记的。就像学习英语你不知道单词,不知道语法能学好英语吗?我们的代码就相当于英语语句,记住了英语单词、词组、语法等那么写出英语语句就不会是件特别难的事情了。我们的代码也是如此,掌握了关键字、语法等写出代码也会很轻松。
那哪些东西不要去记呢?举个例子,无论是 C 语言,还是 Java,还是数据库 SQL 语言等等,都有成百上千往上走的函数/类,这些其实除了一些常用的,其它的我们都不需要去记,你只需要知道在某个语言中应该有某个功能的函数就够了,那我们要用的时候怎么找这个函数呢?其实很简单,到 CSDN、博客园、稀土掘金 等程序员社区去找就行了。
比如说我想在 C 语言中生成随机数,但是忘记代码是怎么写来着,直接搜索“C语言生成随机数”之类的关键词到程序员社区找就行了,肯定是有的,都是前人的经验。
我以 C 语言为例,带大家来浅浅探讨一段令无数程序员肾上腺素飙升的代码:
#include
int main()
{
printf("Hello World");
return 0;
}
#
是预处理命令,这里可以简单理解为就是标识在源程序编译前进行预先的处理工作。
那处理什么呢?我们接着往后看,后接单词 include
,即包含,包含这个词和导入差不多,在编程世界里导入一词更为专业,因此我们之后讲解是我用 导入 来代替包含。
先提一个概念:C 语言开发者们编写了很多常用函数,并分门别类的放在了不同的文件,这些文件就称为头文件(header file),以
.h
作为后缀名。头文件也是文本文件。
因此你应当能理解,stdio.h
就是一个 文件名为 stdio 的头文件,在 stdio 文件中,包含了许多封装好了的函数供我们程序员使用。
stdio 具体又是个怎样的文件呢?stdio实际是一个缩写,我们把stdio进行一个拆分:
std
:standard 的缩写,翻译成中文为“标准”;i
:input 的缩写,翻译成中文为“输入”;o
:output 的缩写,翻译成中文为“输出”。因此 stdio 文件,即是 标准输入输出文件。
总结 #include
每个头文件中都包含了若干个功能类似的函数,调用某个函数时,要引入对应的头文件,否则编译器找不到函数。你需要知道的是 标准输入输出文件 中有两个特别重要的函数:
printf
:输出函数,作用是将内容输出到控制台面板上;scanf
:输入函数,作用是通过键盘输入内容到正在允许的程序中。所以,说到这里,你应当大概能理解我们为什么要我们需要写 #include
了吧,因为 printf
和 scanf
函数来自于 stdio
文件,我们想在自己的代码文件中使用到这两个函数,就不得不在源程序编译前进行预先处理 - 导入 stdio 文件,这样在编译完源程序进行程序运行时才是以合法形式使用printf 和 scanf。
暂时你只需要知道 stdio 文件有这两个函数,实际上该文件中还有许多其它常用函数,这里不做列举。
根据我们上述分析,如果我们没有使用到 stdio 文件中的函数,是不是就不需要写 #include
呢?答案是 不需要写的,我们举个例子:
// 这个程序中就没有使用来自stdio文件的函数如 printf
// 因此当我们编译运行时虽然没有在文件行首声明 #include,也是能够执行成功这个程序的
int main()
{
int temp;
return 0;
}
学会深度思考,这样即使你突然忘记了某个代码片段的编写,但回顾时是很容易轻松与上手的。
即使是工作了几十年的程序员,也会对于某些功能模块的代码拿不准记不清,也依旧会去网上搜索,把网上现成的代码复制下来加以修改就可以放到自己的项目中。为什么他们能很快速的知道某段代码是干嘛的,知道某段代码该如何修改呢?原因很简单,一方面是已经有了大量的实践经验,一方面是对这段代码所应该起到的作用,实现某个功能的代码逻辑理解很深刻。
说说我刚接触编程的经历:大概是在 2021 年放完国庆假后(刚结束大学军训),我开始学习 C 语言,看学校发的谭浩强爷爷的《C语言程序设计》,书的前几页的代码我先是像高中一样背诵了几天,然后开始默写代码。关于深层次的代码解释基本不懂,因为书上虽然有解释但我完全没有沉下心来去尝试理解。就这样懵懵懂懂过了一个月,自己对编程完全提不起兴趣,看书就想困,还和玩的好的高中朋友们抱怨自己不适合编程,看不明白一点。我把这段经历当作给大家的反面教材, 这种做法是真的蠢。
当代码量足够庞大时,代码的可读性就显得尤为重要。这里的可读,不仅仅是对自己可读,也要对其他人可读。一段只有自己能读懂的代码,可以说价值很低,而且这样的代码随着时间的推移往往自己也读不懂。而可读性强的代码,不仅方便移植与交流,更给调试带来了难以估量的便利。对于一个团队来讲,制定统一的编程规范,好处是显而易见的。通常一个项目是由多个成员共同完成,在项目中,经常互相调用组内成员的代码。如果两个人的编程习惯和风格差异显著,那么将会浪费大量时间在读懂代码上。相反,一致而良好的编程规范,会让合作开发变得轻松而高效。
这里介绍几个我觉得比较重要的编程习惯:
代码格式化,主要是整理原代码的缩进,以及运算符的间隔(比如通常在运算符左右都有空格)等。目的是使代码缩进清晰,更容易阅读。
❌ 未格式化的代码
#include
int main()
{
int a=0; if(a==1)
printf("a的值为:");printf("%d", a);
return 0;}
比如这样的代码,你觉得可读性好吗?特别是在实际开发中代码量远比这个多得多,如果程序有 bug 需要排查,这对修改代码的人无非是一种巨大的痛苦。
✅ 格式化的代码
#include
int main()
{
int a = 0;
if (a == 1)
{
printf("a的值为:");
}
printf("%d", a);
return 0;
}
标识符概念:
这里以 变量 的规范命名为例:
什么是注释:用于说明解释程序代码的文字就是注解。被注释的文字,不会被编译器编译执行,注释就是给自己或其它程序员看的。
注解提高了代码的阅读性。会写注释 是 一个程序员必须要具有的良好的编程习惯。将自己的思维先通过注释整理出来,再用代码去体现。
试想一下,在项目开发中,如果遇到 BUG,你或其它程序员需要对你的代码进行修改,可能随着时间推移你也早就忘了某段代码到底是干嘛的了,如果你写了注释,程序员能够快速把握你的代码编写思路,极大提高开发效率。写一手好的代码也是一个高级程序员必备的技能之一。
我举一个我在项目中写过的注释:
// 1.校验用户手机号格式
if (RegexUtils.isPhoneInvalid(phone)) {
return Result.error(HttpStatus.HTTP_BAD_REQUEST.getCode(), "手机号格式错误");
}
String key = RedisConstants.LOGIN_USER_CODE_KEY + phone;
// 2.查看缓存中是否已经存在,得到剩余TTL
Long expire = redisCacheUtils.getExpire(key);
// 3.存在并且剩余时长大于4分钟则不可再次发送验证码
if(expire > RedisConstants.LOGIN_USER_CODE_AGAIN_TTL){
return Result.error(HttpStatus.HTTP_TRY_AGAIN_LATER.getCode(),"发送失败,验证码仍在有效期内");
}
// 4.验证码不存在或者剩余时长小于四分钟,则可以继续发送验证码 --> 先生成六位随机数
String code = RandomUtil.randomNumbers(6);
// 关于恶意并发的问题,在短信云平台已经自动做了处理,这里就无需处理
// 5.先存储到 redis,附带验证次数,初始化为0
redisCacheUtils.setCacheObject(key,code+",0",RedisConstants.LOGIN_USER_CODE_TTL);
// 6.发送短信到手机
boolean result = aliSmsTemplateUtils.sendLoginCode(phone,code);
//boolean result = txSmsTemplateUtils.sendLoginCode(phone, code);
if(!result){
// 6.1 发送失败,则移除 redis 中的验证码缓存信息,并返回
redisCacheUtils.deleteObject(key + phone);
return Result.error(HttpStatus.HTTP_INTERNAL_ERROR.getCode(),HttpStatus.HTTP_INTERNAL_ERROR.getValue());
}
// 6.2 发送成功
return Result.ok();
当然,你也可能会看到一些有趣的注释:
// 老板要求在这里让非 VIP 的用户卡顿一下,这样用户才有充值 VIP 的欲望,说白了,得加钱使用才不卡。
// 如果已经是 VIP 的用户,那么就该 if 语句不成立,就不会卡顿,业务继续执行
if(user.isVip == false){
Thread.sleep(10000) // 单位是 ms,这里卡顿 10 s
}
简单的说:做事之前,要先过遍脑子。
用大脑写代码的意思就是程序应该是在脑袋里成型的。首先,即便是上边那些混乱的写法,也肯定要过大脑的,毕竟不经过大脑,你其实很难下意识打出一行代码的,但问题就是经过大脑的部分实在太少了,每次就那么几行上下文。真正高级的做法是,你能够在脑袋里把整套代码的流程推导一遍,让程序在你的大脑里运行一遍,这时候你会发现写下来会是非常轻松的体力活。有那么一些程序员几乎不加班,但是效率还是很高,那就是因为他们其实无时无刻都能在大脑里写程序。成为一个高级程序最重要的就是要有在大脑里完整的写完一段代码的能力。
如果接受了大脑写代码的说法,那么你会得到一个非常有意思的结论:用的哪种编程语言并不重要,重要的是思想。
纸上得来终觉浅,绝知此事要躬行。
很多学习编程的人在学会某个知识点或者听懂某个算法后就说自己懂了,却没有去上机实验是非常不可取的。有的东西思想其实很简单,但用代码实现起来可能会让你无所适从,可你却没有去实操就不知道有这些问题,这是非常致命的。代码是敲出来的,不要眼高手低。简单的不屑于敲,难的又敲不出来,是一件很尴尬的事情。
代码是一切的基石,看看我们软件界的先辈们吧。Dennis M. Ritchie
决定创造一门“看上去很好”的语言时,如果只是站在高处呐喊,这门语言是划时代的,它有多么优秀,但不去实现,又有何用呢?没有 Dennis M. Ritchie
的亲自编码实现,C 语言不可能诞生,UNIX 操作系统也不可能诞生。Linux 在聚拢成千上万的开源狂热者对它进行开发和扩展之前,如果没有 Linus Torvalds
的编码实现,仅凭他高声呐喊“我要创造一个划时代的操作系统”,有用吗?一切的一切都是以编码实现为前提的,代码是我们前进的基石。这是一个英雄辈出的年代,我们每个人都希望自己被顶礼膜拜,可是这需要资本和实力,而我们的实力体现了我们处理技术问题的能力。
无论你将来的职业发展方向是架构师、设计师、分析师、管理者,还是其他职位,只要还与软件打交道,就有必要打好能亲手写出一手好代码的技术基础。
一个程序员,如果没有亲手写过几万行代码,没有做过几个好的项目,不能说是一个合格的程序员。
一定一定不要跟着学校课程的安排进度来学习,在大学你拥有足够的自由空间去做你想做的事情。
如果你对充满创意和视觉效果的网页设计感兴趣,那么你应该深入了解前端开发的相关知识。前端技术涉及网页的外观、交互和用户体验,让你能够创造出花里胡哨而又令人印象深刻的网页;
如果你对未来从事游戏开发充满期待,那么你应该深入学习 C/C++ 基础,为自己打下坚实的编程基础。接着,你可以探索适用于游戏开发的 C# 语言,将 unity 作为游戏引擎,并深入研究游戏设计原理;
如果你想在大四实习的时候进大厂,那么大二大三请开始去了解大厂对实习生的要求,比如需要 Linux 基础,那就把需要有一台 Linux 服务器,把使用命令模式当成一种习惯;
如果你希望工作 5 年后成为一名架构师,请去了解架构师需要的基本技能,在平时工作时尝试着不同服务架构的搭建;
如果你希望以后可以自己出去创业,那在你具备一定技能时,就多出去走走与人交流,去了解一个完整的项目需要有哪些环节,需要与哪些人员沟通,出了问题需要准备哪些预案。
学会了一门编程语言的基本语法,对一些高级概念有了一定理解,比如指针、面向对象、多线程等等。此外已经学会了基本的数据库操作,增删改查运用娴熟,自我感觉已经掌握了该语言的全部精髓,比较喜欢追求最近流行的新技术,工作中的所有需求习惯通过添加 if else for 来实现,一切以功能实现为目的,比较少的考虑性能方面,注释文档一般能不写就不写,编程习惯如变量的命名还没有自己的风格。
慢慢感觉到了优化的重要性,开始在第一阶段的基础上了解一些设计模式、算法、数据库优化,有了写注释和文档的习惯,对一些框架会去查找源代码,看看其写法及实现方式。技术上会经常去翻阅海外的技术博客及官方文档。会经常在一些博客论坛总结自己的技术,也会用 Github 分享自己的小项目。
已经可以独立带领团队,对项目已经有自己的整体规划,在业务需求出来后能全盘考虑,技术上不追求新潮了,而是根据业务制定出合适稳定的技术方案。对一些有并发需求的业务有相应的预案,对不合理的需求会提出自己的观点,寻求最佳解决方案。
当然除了这三个阶段外,很多开发者会跳出这个圈子,以自己的技术特长及社会资源打造自己的事业。比如以下几位大佬都是程序员出身:
扎克伯格:社交网站 Facebook(脸书)的创始人兼首席执行官。
周鸿祎:360 公司创始人、董事长兼 CEO。
雷军:小米科技有限责任公司董事长兼首席执行官,北京金山软件有限公司董事长,小米智能技术有限公司法定代表人、执行董事、经理 。
张小龙:腾讯公司高级副总裁、Foxmail 创始人、微信创始人。
张一鸣:字节跳动创始人,旗下产品有 抖音、今日头条、西瓜视频 等。
计算机俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算、逻辑计算,还具有存储记忆功能。
计算机由 硬件 与 软件 组成:
软件的分类:
整体图示:
我个人是推荐参加的,但建议只参加 1 ~ 2 个社团, 参加娱乐性质的社团要把握好度,留下更多的时间给自己成长。
如果有机会可以参加一些编程类的比赛,建议在大一下参加蓝桥杯,大二参加服务外包创新大赛、计算机程序设计大赛。
关于 ACM 算法竞赛:计算机界奥林匹克,门槛很高,含金量也非常非常高,需要付出长时间准备,适合于有较强数理基础的同学参加。
当然,对大部分人而言,我都不建议将精力全部投入到比赛中。比赛提升的是算法和代码能力,但是找工作需要的是综合技术实力。获奖是锦上添花,只有你技术满足要求了,获奖才是被认可的。
证 | 是否需要 |
---|---|
计算机二级 | 不需要 |
软考 | 不需要 |
四级 | 必须过 |
六级 | 能过则过 |
驾照 | 可以有 |
要点 | 考研 | 就业 |
---|---|---|
学历 | 有一定优势,在看中学历的企业中优势明显 | 三年工作经验 |
技术经验 | 学校难学到实战经验,发论文为主,实战较少,技术很难成长 | 三年企业级实践开发经验 |
经济 | 花钱上学,经济很难独立 | 挣钱工作,经济积累 |
眼界 | 好的导师带着可以拓宽学术眼界 | 围绕公司业务的学习和成长,好的公司全是优秀的同事一起进步,拓展行业眼界。 |
成长 | 读研孤独,磨练心性 | 在公司的推动下,技术成长更多。 |
机会 | 失败错过秋招机会(1年的代价) | 工作不合适可以选择合适的 |
成功率 | 考研成功率较低 | 工作灵活性更高 |
年龄 | 研究生毕业后,年纪不小。考虑成家立业,压力大 | 奋斗时间更长,机会更多 |
未来 | 工作寿命更长,工作稳定性更高 | 学历低,面临失业,青春饭 |