大学电脑零基础能没有基础学计算机难吗吗?

泡杯茶,我们慢慢聊。编程难,首先入门就难。“Hello,world”,其实并不像你想象的那么简单。某虽不才,小学稀里糊涂的拿过县里奥数三等奖,95年就能用小霸王学习机(Basic)打出杨辉三角形,高中理科,98年能考进重点大学(专业悲催的国际贸易),大学期间还过了计算机二级(FoxBase),另外还参加自考拿到了法学学位和司法资格证书……说这些不是为了吹牛逼,而是为了让你知道我真正正儿八经的学开发的时候有多惨啊有多惨!!!/(ㄒoㄒ)/~~然后,我关了公司,卖掉了汽车,背起了书包,和一大帮毛头小子坐在一起,开始了我的编程之路。真 心坑爹啊!说起来都是泪……我一个文科生,从中间开始学编程,这是一种神马体验?是“坐飞机”的体验呀!我26年的人生中,第一次体会到什么叫“上课坐飞 机”:老师讲的每一个字我都听得懂,但连在一起我就什么都不懂,完全不懂他在说什么。上机好一点,我TM至少知道开机。当然,除了开机我其他什么都不会 了。你可能会奇怪,那我之前学过的 if...else 呢,我之前学过的select呢?我TM的怎么知道?!谁让老师一来就给我讲什么“面向对象”——面向,面向是个什么鬼;对象,你说娟儿,我们马上就要结婚了……印象最深的就是开头那几课,讲什么猫啊狗啊四条腿之类的你以为挺过了这个阶段,能做出一个什么“图书管理系统”之类的玩意就OK了么?培训班是从非常实用的角度出发的,有点像速成鸡,个头看起来好像不错,其实生存能力还完全不行。在实际的学习工作中也发现了自己的不足,……,所以我要想提高的话,最好能去参加一次软考,过了软考怎么怎么牛B之类的。和司法考试一样,软考也是有指定教材的;和司法资格考试不一样的是,这个教材是根本看不懂的!我又在网上下载了视频,没用,吧啦吧啦讲的些什么东西啊?本来热情高涨的信心被哗的泼了一瓢冷水,看着那些什么树啊、图啊、状态机之类的东西,一种无力感悄悄的从心里升起,随之而来的就是困顿彷徨。……我慢慢的明白,我之所以看不懂软考教材,是因为这教材里的每一个章节,都是大学计算机专业里的一门课程。这个教材,更像是一个大纲一个提炼总结,是给那些已经学过了《计算机基础和原理》、《编译原理》、《数据结构和算法》……的大学毕业生作为考前复习资料看的。所以,我要做的,就是先把这些所有的课程学一遍。所以就有这个高潮部分了。我来到图书馆,因为这里的书够多。比如数据结构,这本书我看不懂, 我就再找一本,还看不懂,我就再找一本……总有一本书,能用我懂的语言,告诉我这究竟是怎么一回事!一本不行就两本,两本不行就三本……空荡荡的图书馆里,我有一种进入了金庸武侠世界,博采众长,修炼高深武学的感觉。这种感觉不断的刺激着我的肾上腺素分泌,那种日夜不止的亢奋,直到今日,我都再也没有能体验到过。……在没有任何基础的情况下,我用4个月的时间,完成了大学四年的教程,一次性的通过了据说很多计算机专业毕业生都通不过的软考!我像狼一样的嚎叫,我泪流满面咬牙切齿的叫嚣,“就算我以后一辈子都是个笑话,我有这一次证明就够了!就够了!”有了实战经验,夯实了软件基础,从此就走上了人生巅峰?NO, NO, NO! too young too simple,接着花式虐狗:注意:不是装孙子。我就真是一个孙子!正式上班的第一天,老大就甩给我一个100多页的文档,纯英文的,让我“先看看”。“先看看”是什么意思?不懂啊,更不敢问……于是我就从第一页开始看吧。真心看不懂,不是英文看不懂,是里面的逻辑搞不懂……反正我就是不停的打瞌睡。睡又不敢睡,看又看不懂,问又不敢问,每天真的是如坐针毡如履薄冰。……老大的第二句话砸得我眼冒金星,“你先写个设计文档,给我看一下,然后我们就开工吧”!如果可以自由表情的话,我的眼里一定满是泪水。设计文档?传说中的设计文档?长什么样的?但现实是,我的眼神柔和而平静,轻轻点头,“好的”。但接下来写代码就惨了。因为多人合作,所以公司用的是源代码控制工具TFS,这东西我根本就没听说过,更不知道怎么用。小心翼翼的问了下同事,听得迷迷糊糊似懂非懂就只好硬着头皮上了。然后就闯祸了,一天下午,听到同事叫了一声,“咦?(代码)怎么跑不过了?编译都不行啊?”我的心里一紧。然后很快,就听到诺大的办公室此起彼伏的惊叫应和,一会儿就像一锅粥一样。“老叶,是你提交的代码出了问题?”“啊?应该不会吧?”我后背开始冒汗。“怎么不是?你看你看……”晕死!这MB的源代码一条条记录清清楚楚,捉贼捉赃,被抓现行了!“快点把它fix掉,别人(的代码)都不能跑了”,见我还傻愣着,我们同事提醒我。“fix掉?怎么fix掉?”我在心里悲鸣。装不下去了,只好硬着头皮承认原来自己不会。“啊?”同事看了我一眼,还是过来帮忙吧。结果他也搞不定,“老叶,你究竟干了些什么呀?”“啊,嗯,那个……”我支支吾吾,我哪知道我干了些什么?我要知道,会是现在这个样子么?……日复一日,我悲惨的境遇没有任何改变,不知道这种日子什么时候是个头。以上引用全部都在《折腾》三卷:孕育 (初稿)哪里可以看到?有兴趣的同学可以自己去看。很多人觉得很热血很励志,但只是因为这是“事后吹牛逼”。其实每一步都是一个坎。很多人想学开发,买了一两本书,听了一两节课,天书一样,望而生畏,也就算了。这种人“连庙门都摸不到”,估计要占到一半?剩下的下了狠心,死活硬撑着把培训班之类读完了(或者自学到一定阶段吧),但没有文凭没有工作经验,找不到对口的工作,只好先将就着找一份“相关的”工作,慢慢的渐行渐远,也再也回不了头了。就算好不容易找到了工作,开头那段苦日子,也不是人过的。说句不好听的话,现在大多数90后,从小娇生惯养,受不得气,前几份工作换得走马灯似的……换着换着很多人就放弃了。我上的培训班,二十多个同学,毕业的时候只有十来个了,毕业后做开发的五六个,一直到现在还做开发的……我知道的就两个。好了,讲到这里,其实我还是在说“很难”,“万事开头难”,本来如此。但具体到编程,到底哪里难?还是不能回避这个问题啊,我总结一下吧:1、理解难。不知道是不是因为计算机还刚刚发展的原因,软件开发相关的书籍本身总量就很少,而且更麻烦的事,能称之为“精品”的就更少。这里所谓的“精品”,是指能深入浅出、通俗易懂的把道理说明白,说白了,面向初学者的书。说都说到这里来了,多说几句吧。我发现很多人喜欢推崇“经典”(≈陈旧)的、“大部头”(≈学究式)的书籍,感觉好像要“一般人都看不懂”的书才是好书。我始终觉得这很荒谬,当然,也可能是我境界还达不到。我对于这一类知识性的教科书,就一个要求,让我以最快的时间获取到正确的知识。不要和我绕弯子,又不是看《红楼梦》;甚至不需要太精确,先给我一个大致的轮廓和印象都行。这样的书屈指可数!所以,确实没办法,我只有硬啃啊。“这本书我看不懂, 我就再找一本,还看不懂,我就再找一本”,这其实是挺无奈的。而且计算机的很多底层的东西,非常复杂。什么编译原理,数据结构和算法,我当时学这些东西的时候,就一个感觉:是不是世界上最聪明的人都来搞计算机了?他们的脑袋是怎么把这些东西想出来的?以我涉猎的些许学科来说,其中的很多知识理解起来,需要的其实都是“常识”。比如法律,公平正义;比如经济学,需求供给理智人;比如建筑,构造力学……唯独这个计算机底层相关的东西,究竟是些什么鬼?!烧脑啊!就最简单的排序为例。我能完全理解的就一个冒泡,勉强能理解的有一个好像叫“二分排序”,然后其他的各式各样的排序算法,完全是……算了,都是泪,坏名头,不说了。2、实践难。有一些同学非常具有挑战精神。难是吧?越难我越有劲!于是抱着书本就开始硬啃。结果大家当然能想得到了,然并卵。计算机本质上是一个“实践科学”。仅仅有理解,那是绝对不够的。是骡子是马,得牵出来遛遛。这就是很多计算机专业的同学毕业后找工作很难的原因。所谓“上不了手”啊。最简单的,连一个开发环境都搭建不起来,代码一报错就傻眼,断点调试全不会……实际开发中出现的问题是千奇百怪的,绝对不是你在学校机房,按照书本一点一点敲出来就OK的。同样的,这方面的教材也非常非常的少。基本上只能靠大家自己摸索,或者运气好的,单位上有老鸟带一带。所以才有这种说法:“上一个月的班,比你自己看一年的书都强”。这种实践能力,确实是看书很难获得的。+++++++++++++++++呵呵,得顺便安利一下这个东东:倡议:我们“一起帮” - 自由飞 - 博客园。希望能或多或少的解决一点这方面的问题。+++++++++++++++++好的,说完了入门,我们接着说:编程难,提高更难。其实想想这话像白说的一样,因为任何一个行业做到一定程度再想要提高都很难。一般来说,在这个行业待上两年,再多也就三五年,就应该能入门了。(我个人觉得,入门的标准就是能独立实现,自己岗位范围内的,大部分的功能)以我有限的阅历来看(加这么一句定语,不是谦虚,是心虚了),编程其实是一个很大的概念,但我喜欢把它分成两种(简单重申,以前回答/文章都反复说过):1、基础类的计算机科学。大概就是编译、算法,数据结构之类的,个人觉得确实是拼智商的。我承认,我一直没怎么搞明白这些人是怎么想出这些鬼主意的,我连弱爆了的排序都要掰着手指头算,他们搞什么树啊图啊之类的……没办法,只有膜拜!AlphaGo大战李世石现场直播我一集没拉下,心情一直不好了好几天——总感觉自己就是或者很快就会是一个废物一样。2、应用类的软件工程。首先感谢主,赞美主,还是给了我这种傻子一条活路。在智商被碾压之后还能看到一些不那么需要智商的工作:IT民工——这不就是给我这个“包工头”量身打造的么?你看,连名字都这么像。我以前干的是建筑工程装饰工程,现在叫软件工程。这一类型的开发工作,对于已经入门的开发人员而言,看上去非常简单:后台“无非就是数据库增删改查”,前台就更简单了,数据的显示和传递而已……就算要点什么新技术,“google+英语”就可以“卓越”,“百度+中文”就可以“应付”,一天到晚复制粘贴,修修补补,所以都说自己是个“搬砖的”。怎么突破这种日常的、平庸的、琐碎的、繁杂的工作?有的同学说,“往上爬,做管理吧”;有的同学觉得管理玩不转,“还是做技术吧,争取做架构师”;有的同学回头啃以前懒得啃没啃透的数据结构和算法,“不要在做码农了,我要做程序员”;有的同学觉得楼下贴膜小哥的生意不错,准备转行了……我个人觉得:1和4都转行了,不在我们的讨论范围之类;3其实一开始就没搞懂我之前说的“计算机科学”和“软件工程”的区别;我们着重说一下2,“继续做技术,做架构师”这条路。其实写代码写到一定的时候,你就会发觉:写代码就像写文章。本质上,编程无非就是告诉计算机要怎么怎么的做,就像一个说明书或者命令集,给计算机下一道一道的命令,如果怎么怎么,就怎么怎么……这里有一道分水岭:“会”和“好”的分水岭。之前,是要“会”,比如语法正确、逻辑严密,要能和计算机正确沟通;但之后,是要“好”,这些命令要组织得“好”……但首先怎么个好法,这就很难讲;接着,我要怎么样才能写得这样好,简直没法教。最重要的是,选择A还是选择B,靠的是一种“权衡”。几条路摆在面前,怎么选?这就非常头痛。尤其是做着ABCD单选题长大的孩子来说,这简直就是一场灾难。因为是这样也可以,那样也可以,都可以,都对!你怎么选?你说既然都可以那我随便选,天马行空,想怎么来就怎么来!但恰恰是你还不能这样乱来,因为后面会出问题。不是电脑出问题,是人脑出问题。随着项目代码体量的加大,复杂度的加深,之前不是问题的问题都会一个接一个的冒出来,各个问题之间盘根错节,牵一发而动全身,让你顾此失彼疲于奔命……写不下去了,呵呵。因为这些东西,你经历了才会懂,没经历我说了也是白说,你很难理解。对于目前绝大多数的软件工程而言,最难的其实就是“驾驭复杂度”,因为现在的软件太复杂了!+++++++++++++++++++收藏于:欢迎访问关注,o(* ̄︶ ̄*)o可以加QQ群:729600626++++++++++++++++++说实际的,欢迎大家 注册·一起帮,这是我一个人从头到尾开发的一个网站项目,开发过程全程直播并有录像。设立的初衷就是为了降低自学编程的难度,尤其是一些对新人来说“莫名其妙的”问题(比如配置不对、连不上数据库之类的),问题本身没多少技术含量,但确实新人自学过程中的拦路虎,自己瞎折腾不知道要花多少时间,但如果有人远程桌面帮忙看看,很快就可以解决。有兴趣的同学注册看看吧?
很多同学反映学不懂计算机网络,就单纯记住了一堆的协议和包头部。我当初学计算机网络这个课,学了一遍忘一遍,特别是谢希仁的那本计算机网络,简直阴影。好在最后还是学成归来,分享一下我一路上学习计算机网络的那些方法,也推荐一些靠谱的学习资源,看完没用可以打我,看完有用记得点赞!学习计网的一个误区就是挨个的背下每一个网络协议的作用,头部字段以及通信双方的交互过程。说实话,这种学习方法非常低效,当你自己去抓过包,见过真实的数据包、TCP header,你会惊讶,哇,原来这就是 TCP,而不是记住课本上那一张张header构造图!比如我在大学期间抓过网络包,写过网络编程、也做过可靠传输实验、模拟TCP、kali Linux 上玩过 arp 等一些简单的网络攻击,我觉得计算机网络挺简单的,本质上就是两台主机如何通信。我觉得学习计网,做点网络编程、简单网络攻击、抓包,会让学习更加有趣,我当时是这几个都玩了下,你对这些网络协议的认识就会更加深刻的。之前在我公众号上也写过学习计网的一些建议:学习计网的小建议~在这个过程中在去看书,深入了解,看什么书?比如《图解HTTP》、《图解TCP/IP》、《网络是怎么连接的》、《计算机网络:自顶向下》、《TCP/IP卷一》等等比如国外是如何教计算机网络的?手写 TCP!斯坦福 CS 144,CS144 Lab Assignments - 手写TCP - LAB4这门课程配合《计算机网络:自顶向下方法》,然后做一下课程的lab,基本能够掌握TCP的核心。你想都写了一个TCP了,还能理解不了吗?而且这种理解是从细节到上层工作原理的全面把控。
首先,我给大家推荐一波学习资料,再讲讲学习计网的一些感悟。干货(记得点赞收藏哟):书籍:入门:《网络是怎么连接的》、《图解 TCP/IP 》2.深入学习:《计算机网络:自顶向下》、《TCP/IP 卷一》在这,顺便分享一份大学期间自己整理的电子书库,绝不是在网上那种打包下载的,而是自己需要学到某个方向知识的时候,去网上挨个找的,最后汇总而成。汇集了编程语言(Java、C++、C、Python等等)、操作系统、计算机网络、系统架构、设计模式、程序员数学、测试、中间件 、前端开发、后台开发、网络编程、Linux使用及内核、数据库、Redis....等主流的编程学习书籍。这部分我是会不断把它完善的,当成自己的小电子书库,不多,但贵在精。我整理的这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统:书单:书单推荐,少即是多(含下载方式)3.官方文档:RFC 文档(这是计算机网络的协议标准文档)4. 抓包:《Wireshark 网络分析就这么简单》,这本书写得很幽默风趣,可以看看。5. 源码:之前看了一个pdf《tcp源码分析》:网课:哈工大的计算机网络,B站自取:国外经典课程:CS144,这门课的视频其实并不突出,一般般吧,但是 Assignment/Lab 挺有意思的,用 C++ 实现一个 TCP,当然了不会像 linux 中网络协议栈那么复杂,但是麻雀虽小五脏俱全,你想想你都写了一个tcp了,还怕理解不了?:还有我之前做过的有趣的实验:模拟实现 TCP 可靠传输的人家老外老师就是给力,直接做了一个网站,这个网站你可以通过 TCP 连接上去,然后你需要运行几个节点,互相发消息,他们之间的消息都会经过老师的网站,所以通过网站上是可以控制丢包率的,也能控制节点的拓扑结构,要求就是让你基于这种不可靠的信道,做出可靠数据传输!这简直就是翻版 TCP 嘛,超时重传、ACK、滑动窗口啥的都给我上!就是像下面图中一样,圆圈就表示你可达的范围,不同节点形成各种网络拓扑,可以调节网络 丢包率 Loss chance。网络编程:做一些网络工具:聊天室、p2p简单网络攻击:比如去玩玩 ARP 攻击,在寝室或者你们家里搞点“网络攻击”----分割线----说完了材料,再说说我学习计网的感受吧:首先从一道经典面试题开始:在浏览器输入一个 URL,到网页显示出来,中间发生了什么 ?不知道小伙伴们面试被问过这个问题么?这个问题其实在《Computer Networking: A Top-Down Approach》这本书的末尾花了十几页的篇幅完整的描述过。如果你还是无法很清晰的说出其中过程,那就说明还需要去补课哈。当然了,不同岗位的同学可能关注的重点会不一样,前端同学可能更关注 HTTP、浏览器网络请求、渲染过程,后台同学则更关注网络层和传输层。我们暂时不写这个问题的具体答案是什么,先聊聊如何学习计算机网络。不少初学的小伙伴,在学习计网过程中,特别容易陷入一个误区:挨个的背下每一个网络协议的作用,头部字段以及通信双方的交互过程。比如这个 IP 数据包的头部:花了好大的力气,终于背完了 HTTP、TCP、IP、ARP、DHCP 等一堆协议。最后还是说不清数据包是如何在网络世界传输的。这是多么大的悲伤呀!所以学习计网一定不要完全去死记硬背,不然就会今天记、明天忘。我们要明白,网络存在的目的就是解决主机之间的通信问题。最简单的,我们可以直接将两台主机通过网线连接:这个时候是不需要什么 IP 协议、ARP 之类的东西,但是随着越来的越多的主机加入,会遇到如何寻址、数据包发送冲突等问题。为了解决这些问题,我们引入了 MAC 地址、ARP、IP 这些协议。从问题出发,按照 Why -> How -> What
这样的顺序。先谈遇到了什么问题,再说如何去解决,最终才是搬出前辈们的 RFC 文档,这样就会顺畅很多。而且这是在引导我们去思考如何解决问题,从点对点连接开始如何构造一个网络。如果一上来就搬出原理,比如 TCP 连接管理、状态转换、超时重传、IP 包如何分段与重组这样的东西,我觉得是比较懵逼的。作为初学者我们并不太清楚为什么需要这样做,不这样做行不行?以前学计网的时候,我也有一堆的困惑:比如路由器和交换机有什么区别?为什么有了 MAC 地址还要 IP 地址呢?只用 IP 地址行不行呢?如何理解广播域和冲突域?大家有过这些问题么?如果你脑海里对这些问题的答案非常的清晰,那么恭喜你,你对网络掌握得还不错! 网络世界分层极其明显,所以教材包括教学方式一般分为两类:自顶向下自底向上当然了,学习其它东西也是同理,只不过分层的感觉可能没有计网这么强烈。我们大学老师就是从应用层开始往下讲的,自顶向下的好处是直观,上层的直观感受会让你有探索下层实现的欲望。我们教材也恰好使用的是《计算机网络-自顶向下》这本经典的计算机网络书籍,这本书也是采取自顶向下这样的讲述方式。按照网络的五层模型,从我们日常接触的应用层往下依次把网络的面纱解开。当然了,国内也有不少高校是以自底向上的方式上课的,一上来就是一堆的物理层、链路层协议,典型教材如《Computer Networks, Fourth Edition》。我个人其实也是很喜欢这种方式的,自底向上也有其独特的魅力。独特在哪?因为自顶向下是一层层的从外向内打开,然而最初设计网络的时候肯定不可能是自顶向下的吧。真实的世界一定是自底向上演变的,不可能先定义了 HTTP 协议再去考虑如何设计传输层,这显然不合理嘛。网络的演变一定是最初有两台电脑互相通信的需求,然后是多台电脑,他们之间构成了局域网,再往后局域网之间组成了广域网。最关键的是,自底向上是解决问题导向,比如有了 IP层 为什么还需要传输层呢?我们都知道一台电脑可能有多个进程在使用网络连接,那么当 IP 包到达主机时,怎么区分这是发给哪个进程的呢?操作系统为了能够区分数据是传给上层哪个应用的,才引入了传输层。这是自底向上解决问题的过程。但是自顶向下可能就是学完应用层,直接告诉你,下一层是传输层,然后接着讲 TCP 和 UDP 是什么。比如在《自顶向下》第三章讲传输层的时候,是这样开篇的:运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。我们在本章采用的教学方法是,交替地讨论运输层的原理和这些原理在现有的协议中是如何实现的。与往常一 样,我们将特别关注因特网协议,即 TCP 和 UDP 运输层协议。那我可能就会想,为什么在应用层和网络层之间需要运输层,直接把应用数据包打包在网络层里发送出去不行吗?当然可以,只要给每个应用分配一个唯一的ID,一起放在网络层的数据包发送出去,接收方使用这个 ID 来定位数据是给哪个应用的。其实你也看出来了,这就是把 TCP、UDP 做的事情放在了 IP 层去做。所以为了保持 IP 层的灵活性和功能独立,这里引入了传输层,这就是分层。分层这个思想在计算机世界中非常重要,你可以在任何地方看到它的身影。有一句名言:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”学习计网过程中也需要建立结构化的思维,最直观的结构就是按照计网的层次来,即:应用层、传输层、网络层、数据链路层、物理层。然后在去学习每个层的功能和其中的每个协议,这个过程既可以自顶而下,也可以自底向上。分层学习过程中除了要掌握每一层之外,最重要的其实是要学习层与层之间是如何链接起来的,比如 IP 层和数据链路层就是 ARP 协议。最后当你学完所有的协议后,再回顾一下,一个数据包是如何从 send() 函数发送出去的。离散的 IP 数据包又是如何抽象出“面向连接”的 TCP 层,并且要清晰的认识到这里的连接是一种逻辑状态,建立、断开连接则是同步双方的通信状态。基于这样的认识,才能轻易的回答出类似: “TCP连接建立后出现服务器崩溃、断电、网线被拔...会发生什么情况”这样的问题。 觉得不错的小伙伴,记得帮点个赞。也可以关注下我 @编程指北 哟,致力于分享CS学习方法、校招打法、硬核技术,希望抹平CS学习的信息差,让同学们少走弯路!

我要回帖

更多关于 没有基础学计算机难吗 的文章