编程难在哪里? 时下 6月27日 编辑 嗯嗯 取消关注 关注 私信 我看网上说C言语只有128个字符。语法好像也不多。那不是很快就能编程了嘛?但看很多人说难,不知道难在哪里? 想要学编程,但又没办法完全专注在这一方面。想知道要花费多少精力,难点在哪里,好确定暂时学不学。 我看网上说C语言只有128个字符。语法好像也不多。那不是很快就能编程了嘛?但看很多人说难,不知道难在哪里? 想要学编程,但又没办法彻底专心在这一方面。… 给TA打赏 共{{data.count}}人 人已打赏 C / C++Java 编程编程计算机专业计算机科学
知乎用户 学前班lv0 4月27日 编程学习过程当中会遇到很多困难,但是这些绝大部分都是可以熟能生巧,通过努力去克服的。 但是有一种本质上的困难是难以克服的,甚至正是这种困难,造就了编程的价值,体现了水平的高下:如何用确定性的语言,去描述一个本质上并不确定的事情。 编程的对象是机器。机器,当然也有突然冒烟当机或者暴走的可能性,但是至少在作为编程的理想对象的时候,是完全确定的。 一个命令下去,会得到一个什么样的结果,这个在编程的时候是已知的,可以确定的。 然而编程所要解决的问题,往往是开放的,不确定的。 比如说我们要编程开发一款字处理程序。用户会如何使用它,用它写什么,按照怎样的顺序去写,等等,这些在我们编程的时候其实都是不确定的。 因此,在开发具有一定规模的软件的时候,都会需要进行所谓的需求分析和开发要件定义,其本质上就是为编程固定要解决问题的边界。 当这个边界被清晰定义之后,其实绝大多数的编程(实现),都只是体力活。 真正的难度其实就在于这个边界,也就是需求的梳理。 人的需求是非常模糊,甚至自相矛盾的。就像很多关注本问题的读者,很可能都有既想容易学又想赚大钱的想法。这种想法在理性的世界里面,也就是机器的世界里面是几乎不可能的,也就是很难编程实现。 但是这样的问题还是被一而再再而三地提出,因为这就是人的思考方式,其本质上就不是那么遵循逻辑的,而是有很多很多别的东西。 而这些“别的东西”,就是编程的噩梦,也就是很多段子里所谓的“项目经理总是改需求”,也是代码屎山的根本成因,是真正工程级编程当中的“难以克服”的难点。老板或者客户的要求,往往就是这样。(只能通过不断推倒重来,加快建设屎山和推倒屎山的轮回来逼近,或者说跟随) 高赞回答提到编程类似数学,我很是同意。但是,在对待人性方面,编程没有数学那么好命。数学可以一通定义然后逻辑自洽自己和自己玩,编程却不可以。再高大深奥的东西,最终还是得老板满意客户满意,才是真满意。
凌姐 学前班lv0 5月1日 计算机编程这项工作的本质就是将人们在现实世界中可以用中文、英文、阿拉伯文等自然语言描述的客观事物抽象成某种可以在计算机中可编码的数据形式。以数据库部分的设计为例,在现实世界中,我们描述一个人的简历时应该会提供这个人的简历编号、姓名、性别、年龄、教育经历、工作经历、电子邮件、联系电话等特征信息,那么到了数据库中,我们需要做的就是使用计算机将这些特征信息编码成一个数据集合,服务端在获取到该数据集合后,就会将其视为一份个人简历数据,并在其符合查询要求时打包成响应数据返回给客户端。而客户端在拿到这份简历数据之后,就会将它们填充到指定的简历模板中,呈现给用户一个完整可用的模板。所以,我们在设计“线上简历”应用的第一步就是要按照简历数据的特征来设计它们在数据库中的存储结构。 然而,如果我们只按照上述特征来设计简历数据在数据库中的存储结构的话,很快就会遇到亟待解决的第二个问题。那就是该数据的某部分特征本身也是一个包含了若干特征的数据集合,例如对于其“教育经历”的部分,它本身也需要通过学校、专业、学位以及毕业年份等特征来描述。同样的,其“工作经历”部分也需要通过工作单位、工作岗位、入职年份与离职年份等特征来描述,它们在数据库中的存储结构应该被设计成简历主数据的子数据。 你需要学会的,就是使用编程语言表述这种抽象化过程的能力。
invalid s 学前班lv0 6月13日 编程有点类似数学。 我们知道,数学只有+、-、x、÷、=、>、<、∫、∮、Σ、lim、Δ、√、㏒、∈、∩、∪等很少一些符号,数字也只需要认识0123456789等几个就足够了。 嗯,你现在把这些符号抄小本子上,有空就写有空就背,学得会数学吗? 再附加上每个符号的读音、意义? 那你背吧。再过几天6年级月考就要开始了,我看你交不交白卷。 编程也一样。 很多人走进了“死记硬背编程语言关键字/语法规范”的误区,把“编程语言”学的滚瓜烂熟,一出手把积分符号画的优美流畅——相比之下,数学教授都画成狗刨了。 但他就是不会解二元一次方程组。 问题在哪? 问题在于,数学符号是拿来表达思想的。 你有思想,没见过这些符号你也能表达,自创符号就行了——之所以要学习那些通用符号,只是为了方便你和他人交流而已。 编程也一样。 代码是表达思想的,你知道一件事应该怎么做,你自然就能写出程序来——事实上,为了简便,我们程序员讨论思路是绝不会直接写代码的,太麻烦了:有个东西叫伪代码,还有个东西叫用例图……哦,是的,还有数据流图、控制流图等等等等。 所谓编程,实际上就是“我们有一个目标,为了达到目标,我们需要如此这般的处理”——其中的“如此这般”必须极尽精确、精确到“数字比较大小”然后“如果、那么”的程度。 没错。比如我们要控制机器人,要让它抬手30°,那就必须清清楚楚写出30——嗯,实际上,经常的,机器人手臂转动1°,驱动电机要转7.5圈;所以……实际程序就是:我们向电机控制器发一个高电平,驱动它转动,然后霍尔元件会告诉我们电机已经转了多少圈(比如每转一圈给我们发两个脉冲),那么当我们收到2X7.5X30个脉冲时,机器人手臂就转到位了。 没错。一切最终都是个数字,这就是程序员眼中的世界。 写程序,就是通过数字,精确的把事情做对。 这需要三步。 第一步,你需要知道普通人看起来很“高级”的一件事,背后是什么数学原理。 比如,我们要帮助小姑娘“美白”照片,这是怎么一回事? 很简单。人的皮肤有毛孔、有黑头、有色斑;这些东西体现在“照片”上,是“位图”中的某些点存在“颜色跳变”;那么我们识别出人的五官后、按照比例求出黑头/色斑的典型大小,然后识别出所有大小相仿的“颜色跳变”区,把它的色彩调整到周围皮肤同色——于是,清晰度不变、但皮肤完美无瑕的照片就出现了。 思考题:其实也可以求一小块皮肤的平均色,然后把所有色彩调整到这个平均色。请论述这个做法会给照片带来什么影响。 第二步,知道了数学原理后,把它翻译成更精确的表示。 比如,“颜色跳变”究竟是什么?如何用程序判断? 这一步之后,伪代码就产生了。 第三步,转换伪代码到某种编程语言;最好结合这种语言本身的语法或者质量较好的库,从而简化程序、减少错误,也降低开发工作量。 正因此,我有这么个回答: 所以说编程难在哪? 难在: 1、绝大多数人从一开始就学偏了。他们使劲儿背数学符号,却绝不看数学书。 2、它要求你彻彻底底把一个完整的器物、一项社会活动(包括工厂生产、学校排课等)搞懂、搞透;你越通透,就越能写好程序;否则……慢慢写bug吧。 3、它要求你学会负责,学会独立的主导完成一件事、解决一个问题。 注意,“解决一个问题”并不是“别人给你一道题,你写出答案”,而是“老板说我们要造个智能电饭煲,你要给出智能电饭煲的定义、指出在哪些点可以‘智能’、哪些点不得不让人工干预”。 然后,所有你认为可以智能的点,你都要自己提问——包括但不限于‘如何智能’‘会不会假阳性’‘会不会假阴性’‘判断错误最差结果会是什么’‘如何及时发现错误’‘如何纠错’‘如何降低成本’等等问题,你都要结合你的方案、以更合适更接地气的方式提出。 比如,当我们想用磁铁的居里点来判断温度时,就要问一下:如果做锅巴饭,这东西还能不能用?但为了兼容锅巴饭,用户烧水时会不会产生额外的风险?如何证明会还是不会呢? 现实中,第一点就足够刷掉90%以上的人。这就是编程困难的原因。
倪静风 学前班lv0 6月27日 编程不是数学。 编程是自然科学,数学不是自然科学。 数学中的计算数学部分是自然科学,但去了计算数学部分,很多是一种人为规定,这部分本质是文科。 计算机专业中有一门课,叫数值计算,专门就是讲算法和数学的差异性怎么处理。 数学不是自然科学,但数学中有计算数学部分,如很多几何算法是可以直接使用数学内容。这部分是自然科学。而很多数学概念到计算中需要重新做算法修正,正是修正这种非自然科技部分。有的可能无法修正,只能人为规定一个返回值,这个部分不是自然科学。 数学是没有计算机的年代,人们玩的人类推理式”编程“,但不是计算机编程。如无限这种在计算机算法中是没有,计算机算法中无限无穷都是一个时间相关的数字,只要到时间一取数,就是一个具体值,并不是存在取数后又能变化。 计算机中也没有无限连续,数据存储位是有限的,是离散的,内存是有大小的,存储也是有大小的,并不存在无限连续,无限精度(计算机的无限精度是一种模拟,如和时间相关的长精度,但本身还是有限的,因为运行时间不可能无限长)。 计算机算法是自然科学,编程也是自然科学,行不行电脑跑一下就知道了(而非计算数学不能跑),很多优秀的程序也不是规划设计出来的,是不断做试验调试出来的,如同物理试验一样,反复”穷举“,不断总结,反复试验调试出来的。 编程的难,难在现实世界的复杂性。 而计算机中建模实现复杂性会更高,因为受限于计算机本身的限制(如算力,内存,功耗等),更加难。 等于多加了更多重限制条件下,找最优化解。 在已知条件下,存在一个数字密码找到明天的中奖号码,或后天的股票代码,也就是理论上存在可以精确预测的未来,但实际电脑算力不足或采集到的数据不足以分析。即在数据或计算不足时,找不到最优化解,这时更多地使用次优化解代替,但理论上这个最优化解是存在的,你没有达到最优化解前,都是有优化空间,但难度可能是指数增长的,需要成本也有可能是极大。 如双摆线的预测就是一个世界难题,你用计算机算法来预测,一样是世界难题,并不会因为使用了计算机而变得简单。使用计算机算法来模拟预测,还受限受限于计算机本身的限制,如计算时内存是有限的,算力是有限的。 人在编程时的时间和资源有是限的,现实世界的复杂性+计算机本身的复杂性限制=编程难。
啊窝额 学前班lv0 6月27日 如果单说编程语言,其实都比较简单,难的其实是底层逻辑。 就像大家尝尝调侃的一样,通常来说基本学好基础语言部分如何能能吃上饭,学好数据结构能让自己吃的更饱一点。 难点一:技术更新迭代快 作为程序员来说需要不断完善自己的知识库,如果不及时更新自己的知识库就会被行业所淘汰,没办法应对多变的行业。 计算机组成原理,编译原理,计算机网络,数据结构……大学期间的课程五花八门,有些课程晦涩难懂,很多人都觉得,学这些有用吗,这些不都过时了吗,我只要掌握行云流水的编码能力,一气呵成的框架体系,写一手漂亮的代码,不就行了吗?但并不是这样。 难点二:知识点多、杂 就拿Java来说,知识点特别分散,细节也非常多,不太容易记录,而且还经常学了就忘了,这就要求大家具有很强的逻辑思维能力,能建立一套自己的知识体系,捡重点学习,精准学习。 本人大一学生,以后想进大厂,正在学Java,能推荐一下学习路线吗? 学习Python有什么推荐的网课,书籍资料,以及该装哪个版本的Python? 想参加前端培训,2万多培训前端靠谱么? 难点三:框架搭建 编程并不是简单的将代码堆积,需要搭建框架,需要抽象数据模型,保证后期的功能平滑的扩展,不是生硬的堆积。解决的方法:多去研究现有的框架,多思考为什么要这么搭建,还有什么更好的解决方案,慢慢框架的思想在大脑中就会慢慢的建立。 增删查改是程序员基础的不能再基础的能力,这个阶段之后就要提升自己的技术能力,看底层代码是如何实现的,如果真的遇到框架问题是不是有能力去解决。一定要学会主动学习,多跟进一些新的技术才是保持职场竞争力的关键。具体进阶学习如下: 以问题为导向:Java知识繁杂,以问题为导向,作为切入点,能够提高Java学习的效率;特定场景下的需求解决:每一种架构都有典型的应用场景,要结合实际应用场景去分析和解决问题;利用google:作为一名程序员,遇到未知问题是很正常的事情,关键利用好google,社区、论坛;性能的持续改进和优化:在进阶阶段,应该要具备基本的性能调优能力,关注性能管理。 一些经验之谈:
夏天的葡萄 学前班lv0 6月27日 分享之前看到的一个观点: 编程一点都不难,它只是和你十几年来在学校受的教育格格不入而已。 自小你受到的教育总是:第一步,记忆和理解一个个知识点;第二步,给你一个未完成的拼图,让你把自己记忆的某几个合适的知识点放进去(超过3个知识点就是难题,超过5个就是高考数学的最后三道大题压轴了),对了就是满分! 有一个人总结了软件开发中无法规避的四个难点:复杂度、一致性、可变性、不可见性 这个人就是IBM大型机之父,Frederick Brooks. 复杂度: 规模上,软件实体可能比任何由人类创造的其他实体还要复杂,因为没有任何两个软件部分是相同的。如果有相同的情况,我们会把它们合并成共调用的子函数。 数字计算机本身就比人类建造的大多数东西要来的复杂,由于复杂度,团队成员之间的沟通非常困难,导致产品开发中会出现很多问题,使成本超支、进度跟不上;复杂度不仅带来技术上的困难,还会引发很多管理上的问题,它使全面理解问题变得很难,从而妨碍了概念上的完整性。 一致性: 工程师必须控制的数据很多是随心所欲的、毫无规则可言的,来自若干必须遵循的人为惯例和系统。它们随不同的接口而改变,随时间的推移而改变,而且这些变化不是必须的,仅仅由于它们是不同的人设计的结果。 某些情况下,因为是开发最新软件,所以它必须遵循各种接口。另一些情况下,软件的开发目标就是兼容性。在上述的所有情况中,很多复杂性来自保持与其他接口的一致,对软件的任何再设计,都无法简化这些复杂性。 可变性: 所有成功的软件都会发生变更。当人们发现软件很有用时,会在原有的应用范围的边界,或者在超越边界的情况下实用软件。功能扩展的压力主要来自那些喜欢基本功能,又对软件提出很多新用法的用户们。 简而言之,软件产品扎根于文化的母体中,如各种应用、用户、自然及社会规律、计算机硬件等等。后者持续不断的变化着,这些变化无情的强迫着软件随之变化。 不可见性: 软件是不可见和无法可视化的。软件的客观存在不具有空间的形体特征。当我们试图用图形来描述软件结构时,会发现它不仅仅包含一个,而是很多相互关联的、重叠在一起的图形。 除去软件结构上的限制和简化方面的进展,软件仍然保持着无法可视化的固有特征,从而剥夺了一些具有强大功能的概念工具的构造思路。这种缺憾不仅限制了个人的设计过程,也严重阻碍了相互之间的交流。 普通人怎么学习编程? 方法很重要,可以尝试看视频,找到有效的学习方法,这样学起来会如鱼得水。现在很多人刚开始都是看免费的基础视频,边看视频边跟着操作,学起来比看书要简单。 具体的学习方法如下: 对这门语言做一个学习的规划,比如先了解这门语言的发展史,以及应用领域,优缺点。 按照网上的学习资源,来制定一个适合自己的系统的学习路线图。 多实践,遇到解决不了的问题多Google,百度。 加一些相关的编程语言学习群群,多参与学习。 定时写笔记,博客,总结心得! Github——你是我的神 ! 1、随手收藏的一些开源的电子书: 2、一些适合新手的入门项目,大家可以参考着学习: 3、一些github的其他学习资源: 英语不好能不能学编程? 对于编程入门的人来说,英语的影响并不是很大。因为编程过程中会出现的那些英语单词其实都不难,很多人看久了以后就认识了,并不会影响编程工作。 如果你的英语不好,在这个阶段,可以找到那些编程中需要的专业英语单词,然后把这些词记住,就可以应付绝大多数情况。 但是等你学到一定程度之后,还是需要学好英语的,因为一些不错的文档和资源都是国外的文献,所以为了今后提升编程能力还是好好学。 遇到不会的问题怎么办? 学会使用 Google 为什么也成为了必要。在你学习,开发的过程中会遇到很多的问题,这个时候会经常用到搜索工具。 在编程领域,英文资源比中文资源多了不是一星半点。比如 stackoverflow(一个编程的问答网站)几乎包括了你学习编程时会遇到的各种问题的答案,以为这些问题很早以前就有人遇到过了。所以,遇到编程问题时,记得使用英文在 Google 上搜索答案。
知乎用户 学前班lv0 6月27日 很多人都能写 140 字的微博,但一部 140 万字的书,绝不是一万篇微博拼凑出来的。篇幅越长,结构就越重要,写作难度也越大。 编程也是如此,写小一段代码容易,但写一个大型软件很难。 现代的商业软件,轻轻松松就是几十上百万行代码的量级。即便抛开性能、易用性等目标不谈,单是把这么多代码组织起来,让它们能作为一个整体正常工作,并且支持灵活地修改和增添功能,这就已经是一个巨大的挑战了。
大师的学徒 学前班lv0 6月27日 谢邀,编程难在思维转变 首先要从现实思维转变成计算机思维,利用计算机语言,编写特定功能的程序 比如用C语言描述一个链表 首先,你要理解什么时是链表?就是利用计算机离散空间的存储结构。 好的,然后转化成C语言,如何向计算机申请一段空间,如果把很多段空间连接起来。 这里面就要理解什么是指针,什么堆内存。 好的,现在连接起来了,成了一段链表了,怎么去遍历,插入,删除,修改。 写到这里,一个简单的单向链表就搞定了。 然后就是双向链表,循环链表。 这些搞定了,你还可以试试如何设计一个限制总大小空间的链表,比如一个100mb的链表。 怎么管理空间,超过限制怎么删除。 好了,这里面所有内容都用计算机语言去描述,需要利用计算机语言里面的控制语句,循环语句,来实现你的目的。 到这里,你仅仅只学会了编写数据结构。 转到工程上,仅仅一个数据结构只是最基本的,编程你还得具有工程思维,搞得懂需求,以及对需求的全面考虑。 比如我要在网页上展示一个头像。 头像肯定是一个图片,一个<img>标签 首先就是前端 如果和获取这个图片 如何上传这个图片 图片要不要圆角展示 图片大小如何适配,在不同浏览器下大小是多少 移动端和pc端展示位置等有什么变化 图片要不要添加点击事件 点击之后什么效果 点击之后跳转页面是什么 然后就是后端 需要获取,上传接口提供给前端 图片位置放在哪里云服务器,还是本地服务器,还是自己搭建文件服务器 图片命名规则,如何管理 数据库用户信息中存储图片信息 后台管理端要不要展示用户头像 用户创建的时候要不要强制上传头像 不强制上传要不要给一个默认头像 可能还有思考不全面的,这些需求仅仅是对应了一个,展示头像 需求的难点过了 还有架构的难点,前端后端选型什么框架,如何组织代码,如何管理代码,如何拆分业务,人员如何配备,如何测试,如何验收,验收标准是什么。 学会了,编写数据结构,你是一个合格的计算机学习者 学会了,编写特定需求,你是一个合格的程序员 学会了从全局思考到特定需求,学会思考架构和人员了,你开始具有了架构师的思维,中间可能还会遇到高并发,大数据等各种问题。 别小看每一步,每一步都是经验和项目的积累,代码质量也是在对自己严格要求下慢慢提升。 可能还会学习不同语言,利用不同语言,解决不同问题。
知乎用户 学前班lv0 6月27日 英文写作难在哪里?我看英语书上也就26个字母,算上大小写和数字及标点符号,80个字符顶天了。语法也不多,也就是几个时态,语态。那不是很快就能写英文文章了吗?但是看很多人说难,不知道难在哪。想学英文写作,但是又不想背单词,想知道要花费多少精力,难点在哪里,好确定暂时学不学,在线等,挺急的。 编程其实是种思维方式,看你能不能做到: 把一个大问题分隔成N个相互关联的小问题。每个小问题解决了,大问题也就解决了。 能不能理清一个问题的脉络。 能不能考虑各种边界条件,并且划分清楚。 能想明白这些,编程就不难。但是这3点要做到,不容易,需要学习: 计算机原理 至少一门编程语言 数据结构 当然后面还有很多,但是至少要学这点。
hsmcomputer 学前班lv0 6月27日 本人就以Java为例来说明。 1 Java入门很简单,搭建个开发环境,然后运行个代码,就能看到效果了,皆大欢喜,从这意义上来看,编程及其容易。 2 要把Java学到能找到工作的程度,不容易,但根据网上给出的流程也能做到。 3 但是,如果单靠自学Java,然后以此找到工作,极难,话说回来,如果找到第一份能提供java项目实践经验的工作(不管用什么方式找到),后面提升起来就相对容易了。 其实大多数人学java,绝对不是为了兴趣,而是为了找工作,所以能面向大多数学java人的回答其实是第3点,即单靠自学,找到java方面的工作极难。 看到这里可能不少朋友会有疑问,java从入门到找工作的学习路线是现成的,相关书和视频也很多,而且找工作方面的准备简历和面试方面的技巧也有很多文章,那为什么靠自学很难找到java方面的工作呢?原因是时间和精力。 比如应届毕业生,大四学生一般要做毕业设计或者实习,一般是会从大四下学期开始才找工作,而7月就要离校了,一般如果到5,6月还没找到工作就会慌了,所以留给零基础应届生学java然后找工作的时间一般不会超过3个月。 其实大家也都知道,3个月时间看似不短,但学java的坑太多,就连刚开始的搭建开发环境步骤,如果没人帮忙,还真有可能一周搭不成,而在学习时,遇到任何一个语法点卡住,就有可能耽搁1,2天,这还不算去学不该学技能的时间。 而且找工作至少得留下一个月吧,在简历和面试技巧没问题的前提下(大多数零基础的java程序员做不到这点),一个月磕磕碰碰勉强能找到工作,更别提遇到简历或面试问题。 再说工作后零基础转行java,这些人由于平时还要上班,只能利用晚上和周末学,学习时间还比如在校生。对零基础想转java开发的这些人来说,虽然没有时间限制,但在学习过程中遇到问题,或者遇到工作忙,更容易放弃。 或者哪怕毅力再好,每天都坚持个学习,也会遇到“学习技能”和“面试技术”脱节的问题,造成的后果是学了3个月,看似了解了一大堆语法,但还是做不了项目,甚至还不知道java面试会问什么。这样学习的结果往往是学习时间被拖长,然后最后不了了之。 或者大家换个角度思考下,如果靠自学,很容易就能入门Java并找到工作,要这么多java培训班干嘛?本人这里无意为任何培训班站台,但出于让大家能准确到评估通过自学找到java工作的难度和工作量,所以说这样个情况:对于目前品牌比较好的培训学校,其中的学员哪怕是找到工作,其实也是勉强地靠面试话术通过面试,而且不能说所有的人都入行。而对于那些品牌一般的培训班,出现投诉和纠纷,不能说没有,而且也更不能确保所有的学员都找到工作。 出钱买了培训班的技术和就业服务,零基础入行还比较艰辛,更别说靠自学入行了。下面就具体说下靠自学入行java,并最终能找到工作的难度。其实这些情况大家稍微打听下或稍微实践学习一下java就能有同感,本人绝无夸张的程度。 1 第一关无疑是搭建环境,搭环境包括建jdk环境,IDEA集成开发环境,数据库环境,建maven,外带能下载pom包。很多初学者能搭建jdk、IDEA集成开发环境和数据库环境,但建maven同时配置pom环境就做不成了,这方面估计能让约10%初学者止步。 2 第二关是学Java语法,包括集合,面向对象,多线程和IO等的语法。这一块学起来倒不难,但很容易把初学者拉进误区,或者导致初学者学了不该学的技术。 比如常规Java书语法书,包含了IO,socket编程甚至是界面编程等技能,这些技能其实在项目开发里是用不到的。而且,java语法技能,照着书上的代码敲一遍然后学,快的话可能半个月,但如果中间敲的时候遇到问题,或者是过于拘泥于语法,会发现用1,2个月(甚至更多时间)学的语法点,其实真用不到项目开发里。 甚至我还真见过,用2个月时间学好java语法,也运行通了一些小游戏和基于界面编程的案例,依然是一头雾水。也就是说,学java语法就会让一些初学者学习上走弯路,或者是用2个月,甚至更长的时间才学完,之前也说了,留给初学者入门Java的时间并不多。 3 第三关是web框架开发。其实甚至有不少人,在学好java语法后点错科技树,去学ssm,或者是界面开发,或者是其他用不到的技术。 学这个不容易,因为spring boot等框架的运行环境不容易搭建,第二这里如果出现任何一个配置问题或者依赖包版本问题,就会阻塞住学习。 有工作经验的人事后想想,在找工作前,Spring boot只需要学整合数据库做增删改查业务的相关技能,但初学者未必知道,往往还会深入学习分布式组件,或者深入学习ioc等技能,这样的话更会因为学习难度提升从而失去学习信心,或者是拉长学习进度。 这样说吧,假设有100个想通过自学入行java,在3个月后,或者时间再拉长些,4,5个月后,能完成学习spring boot+JPA这个找工作必备技能的人数顶多就20个人,剩下的人估计在学习过程中就放弃了,或者因为遇到开发环境、语法或配置文件方面的阻碍性问题,同时没人帮助,从而无法继续学习。 但哪怕是学到这种程度,其实离开找到工作,还有一段距离,因为掌握了工作必备的技术是一方面,通过简历和面试向面试官证明能力,从而找到工作,这是另一方面。 而java初学者哪怕是学好了 spring boot+JPA技能,在找工作时往往还会出现如下的问题。 1 简历上无法证明自己的java开发经验,或者是写的项目经验一看就是学习经验,这样的简历根本没有机会得到面试机会。 2 在面试时着重背八股文,而无法证明自己spring boot的项目经验,而且在屡战屡败的情况下还不知道该怎么提升。 所以假设有100个想通过自学入行java,最后能靠自己的能力,边做边试探,然后找到工作,估计顶多就10人,甚至更少。 写了这么多,做个结论,靠自学java然后成功找到工作,不容易,如果再要加个限制条件,通过自学java,在有限的3到5个月内找到java工作,更不容易,难点有哪些呢? 1 难点不在于缺乏资料,缺乏学习路线,而是资料和学习路线太多,从而导致初学者把大量珍贵的学习时间用在不必要学的技能上。 2 如果靠自学,没人在边上辅导,可能学习过程中步步是坑,而且不知道怎么解决,这可能会让学习过程不了了之,或者是延长学习时间。 3 学习难度本身就不小,而面试找工作的难度更大,这块甚至不少初学者连为什么简历没人回,为什么面试每次都失败的原因都不知道。 4 对于已经有工作经验的人来说,转行java时,面试官更要确认之前的java相关经验,没的话基本面试不会成。所以对那些已经工作但想转java的人来说,证明之前的java项目经验尤其是个难点。 而且上述的难点,绝非本人危言耸听制造焦虑,大家只要尝试性地用一周时间学习下java,哪怕是学习下java的最简单的集合或面向对象方面的语法,就会感到上文列出的学习难点是所言不虚。
IT人刘俊明 学前班lv0 6月27日 作为一名计算机专业的教育工作者,我来说说我的个人看法。 首先,我并不认为编程语言难学,在所有的计算机专业课当中,编程语言是最容易学习的课程之一,同时编程语言也被认为是打开计算机技术大门的钥匙。 编程语言容易学习并不意味着编程就容易,实际上编程确实有难度,因为程序涉及到逻辑、算法、数据等一系列知识,掌握了基本的编程语法并不意味着就能轻松解决各种编程问题,大部分优秀的程序员也都需要一个积累的过程。 对于初学编程的同学来说,难点在于理解编程语言当中的各种“抽象”,要想突破这个难点,一定要多做实验,通过实验来为各种抽象概念建立起画面感,这是比较重要的。 理解了编程语言当中的“抽象”,就会逐渐掌握基本的编程流程,同时形成一个初步的编程思想,这个阶段要通过场景实践来积累编程经验,本科生同学要多参与科研实践和项目实践活动,参加专业竞赛同样能够提升自己的编程能力。 对于已经具备了一定编程基础的同学来说,要想进一步提升自身的编程能力,应该明确一个自己的主攻方向,提升对于算法和数据的认知能力,这个过程不仅仅要掌握一些编程语言的底层逻辑,更需要掌握如何运用编程语言来完成算法的实现、训练和验证。 其次,随着云计算、大数据和人工智能等技术的发展,目前在应用层面的编程难度已经越来越低了,基于云平台的编程门槛也在不断下降,尤其是在当前低代码平台的推动下,很多非计算机专业的同学也可以完成一些业务场景的编程任务,这是一个大的发展趋势。 最后,如果有编程相关的问题,欢迎与我交流。
编程学习过程当中会遇到很多困难,但是这些绝大部分都是可以熟能生巧,通过努力去克服的。
但是有一种本质上的困难是难以克服的,甚至正是这种困难,造就了编程的价值,体现了水平的高下:如何用确定性的语言,去描述一个本质上并不确定的事情。
编程的对象是机器。机器,当然也有突然冒烟当机或者暴走的可能性,但是至少在作为编程的理想对象的时候,是完全确定的。
一个命令下去,会得到一个什么样的结果,这个在编程的时候是已知的,可以确定的。
然而编程所要解决的问题,往往是开放的,不确定的。
比如说我们要编程开发一款字处理程序。用户会如何使用它,用它写什么,按照怎样的顺序去写,等等,这些在我们编程的时候其实都是不确定的。
因此,在开发具有一定规模的软件的时候,都会需要进行所谓的需求分析和开发要件定义,其本质上就是为编程固定要解决问题的边界。
当这个边界被清晰定义之后,其实绝大多数的编程(实现),都只是体力活。
真正的难度其实就在于这个边界,也就是需求的梳理。
人的需求是非常模糊,甚至自相矛盾的。就像很多关注本问题的读者,很可能都有既想容易学又想赚大钱的想法。这种想法在理性的世界里面,也就是机器的世界里面是几乎不可能的,也就是很难编程实现。
但是这样的问题还是被一而再再而三地提出,因为这就是人的思考方式,其本质上就不是那么遵循逻辑的,而是有很多很多别的东西。
而这些“别的东西”,就是编程的噩梦,也就是很多段子里所谓的“项目经理总是改需求”,也是代码屎山的根本成因,是真正工程级编程当中的“难以克服”的难点。老板或者客户的要求,往往就是这样。(只能通过不断推倒重来,加快建设屎山和推倒屎山的轮回来逼近,或者说跟随)
高赞回答提到编程类似数学,我很是同意。但是,在对待人性方面,编程没有数学那么好命。数学可以一通定义然后逻辑自洽自己和自己玩,编程却不可以。再高大深奥的东西,最终还是得老板满意客户满意,才是真满意。
计算机编程这项工作的本质就是将人们在现实世界中可以用中文、英文、阿拉伯文等自然语言描述的客观事物抽象成某种可以在计算机中可编码的数据形式。以数据库部分的设计为例,在现实世界中,我们描述一个人的简历时应该会提供这个人的简历编号、姓名、性别、年龄、教育经历、工作经历、电子邮件、联系电话等特征信息,那么到了数据库中,我们需要做的就是使用计算机将这些特征信息编码成一个数据集合,服务端在获取到该数据集合后,就会将其视为一份个人简历数据,并在其符合查询要求时打包成响应数据返回给客户端。而客户端在拿到这份简历数据之后,就会将它们填充到指定的简历模板中,呈现给用户一个完整可用的模板。所以,我们在设计“线上简历”应用的第一步就是要按照简历数据的特征来设计它们在数据库中的存储结构。
然而,如果我们只按照上述特征来设计简历数据在数据库中的存储结构的话,很快就会遇到亟待解决的第二个问题。那就是该数据的某部分特征本身也是一个包含了若干特征的数据集合,例如对于其“教育经历”的部分,它本身也需要通过学校、专业、学位以及毕业年份等特征来描述。同样的,其“工作经历”部分也需要通过工作单位、工作岗位、入职年份与离职年份等特征来描述,它们在数据库中的存储结构应该被设计成简历主数据的子数据。
你需要学会的,就是使用编程语言表述这种抽象化过程的能力。
编程有点类似数学。
我们知道,数学只有+、-、x、÷、=、>、<、∫、∮、Σ、lim、Δ、√、㏒、∈、∩、∪等很少一些符号,数字也只需要认识0123456789等几个就足够了。
嗯,你现在把这些符号抄小本子上,有空就写有空就背,学得会数学吗?
再附加上每个符号的读音、意义?
那你背吧。再过几天6年级月考就要开始了,我看你交不交白卷。
编程也一样。
很多人走进了“死记硬背编程语言关键字/语法规范”的误区,把“编程语言”学的滚瓜烂熟,一出手把积分符号画的优美流畅——相比之下,数学教授都画成狗刨了。
但他就是不会解二元一次方程组。
问题在哪?
问题在于,数学符号是拿来表达思想的。
你有思想,没见过这些符号你也能表达,自创符号就行了——之所以要学习那些通用符号,只是为了方便你和他人交流而已。
编程也一样。
代码是表达思想的,你知道一件事应该怎么做,你自然就能写出程序来——事实上,为了简便,我们程序员讨论思路是绝不会直接写代码的,太麻烦了:有个东西叫伪代码,还有个东西叫用例图……哦,是的,还有数据流图、控制流图等等等等。
所谓编程,实际上就是“我们有一个目标,为了达到目标,我们需要如此这般的处理”——其中的“如此这般”必须极尽精确、精确到“数字比较大小”然后“如果、那么”的程度。
没错。比如我们要控制机器人,要让它抬手30°,那就必须清清楚楚写出30——嗯,实际上,经常的,机器人手臂转动1°,驱动电机要转7.5圈;所以……实际程序就是:我们向电机控制器发一个高电平,驱动它转动,然后霍尔元件会告诉我们电机已经转了多少圈(比如每转一圈给我们发两个脉冲),那么当我们收到2X7.5X30个脉冲时,机器人手臂就转到位了。
没错。一切最终都是个数字,这就是程序员眼中的世界。
写程序,就是通过数字,精确的把事情做对。
这需要三步。
第一步,你需要知道普通人看起来很“高级”的一件事,背后是什么数学原理。
比如,我们要帮助小姑娘“美白”照片,这是怎么一回事?
很简单。人的皮肤有毛孔、有黑头、有色斑;这些东西体现在“照片”上,是“位图”中的某些点存在“颜色跳变”;那么我们识别出人的五官后、按照比例求出黑头/色斑的典型大小,然后识别出所有大小相仿的“颜色跳变”区,把它的色彩调整到周围皮肤同色——于是,清晰度不变、但皮肤完美无瑕的照片就出现了。
思考题:其实也可以求一小块皮肤的平均色,然后把所有色彩调整到这个平均色。请论述这个做法会给照片带来什么影响。
第二步,知道了数学原理后,把它翻译成更精确的表示。
比如,“颜色跳变”究竟是什么?如何用程序判断?
这一步之后,伪代码就产生了。
第三步,转换伪代码到某种编程语言;最好结合这种语言本身的语法或者质量较好的库,从而简化程序、减少错误,也降低开发工作量。
正因此,我有这么个回答:
所以说编程难在哪?
难在:
1、绝大多数人从一开始就学偏了。他们使劲儿背数学符号,却绝不看数学书。
2、它要求你彻彻底底把一个完整的器物、一项社会活动(包括工厂生产、学校排课等)搞懂、搞透;你越通透,就越能写好程序;否则……慢慢写bug吧。
3、它要求你学会负责,学会独立的主导完成一件事、解决一个问题。
注意,“解决一个问题”并不是“别人给你一道题,你写出答案”,而是“老板说我们要造个智能电饭煲,你要给出智能电饭煲的定义、指出在哪些点可以‘智能’、哪些点不得不让人工干预”。
然后,所有你认为可以智能的点,你都要自己提问——包括但不限于‘如何智能’‘会不会假阳性’‘会不会假阴性’‘判断错误最差结果会是什么’‘如何及时发现错误’‘如何纠错’‘如何降低成本’等等问题,你都要结合你的方案、以更合适更接地气的方式提出。
比如,当我们想用磁铁的居里点来判断温度时,就要问一下:如果做锅巴饭,这东西还能不能用?但为了兼容锅巴饭,用户烧水时会不会产生额外的风险?如何证明会还是不会呢?
现实中,第一点就足够刷掉90%以上的人。这就是编程困难的原因。
编程不是数学。
编程是自然科学,数学不是自然科学。
数学中的计算数学部分是自然科学,但去了计算数学部分,很多是一种人为规定,这部分本质是文科。
计算机专业中有一门课,叫数值计算,专门就是讲算法和数学的差异性怎么处理。
数学不是自然科学,但数学中有计算数学部分,如很多几何算法是可以直接使用数学内容。这部分是自然科学。而很多数学概念到计算中需要重新做算法修正,正是修正这种非自然科技部分。有的可能无法修正,只能人为规定一个返回值,这个部分不是自然科学。
数学是没有计算机的年代,人们玩的人类推理式”编程“,但不是计算机编程。如无限这种在计算机算法中是没有,计算机算法中无限无穷都是一个时间相关的数字,只要到时间一取数,就是一个具体值,并不是存在取数后又能变化。
计算机中也没有无限连续,数据存储位是有限的,是离散的,内存是有大小的,存储也是有大小的,并不存在无限连续,无限精度(计算机的无限精度是一种模拟,如和时间相关的长精度,但本身还是有限的,因为运行时间不可能无限长)。
计算机算法是自然科学,编程也是自然科学,行不行电脑跑一下就知道了(而非计算数学不能跑),很多优秀的程序也不是规划设计出来的,是不断做试验调试出来的,如同物理试验一样,反复”穷举“,不断总结,反复试验调试出来的。
编程的难,难在现实世界的复杂性。
而计算机中建模实现复杂性会更高,因为受限于计算机本身的限制(如算力,内存,功耗等),更加难。
等于多加了更多重限制条件下,找最优化解。
在已知条件下,存在一个数字密码找到明天的中奖号码,或后天的股票代码,也就是理论上存在可以精确预测的未来,但实际电脑算力不足或采集到的数据不足以分析。即在数据或计算不足时,找不到最优化解,这时更多地使用次优化解代替,但理论上这个最优化解是存在的,你没有达到最优化解前,都是有优化空间,但难度可能是指数增长的,需要成本也有可能是极大。
如双摆线的预测就是一个世界难题,你用计算机算法来预测,一样是世界难题,并不会因为使用了计算机而变得简单。使用计算机算法来模拟预测,还受限受限于计算机本身的限制,如计算时内存是有限的,算力是有限的。
人在编程时的时间和资源有是限的,现实世界的复杂性+计算机本身的复杂性限制=编程难。
如果单说编程语言,其实都比较简单,难的其实是底层逻辑。
就像大家尝尝调侃的一样,通常来说基本学好基础语言部分如何能能吃上饭,学好数据结构能让自己吃的更饱一点。
难点一:技术更新迭代快
作为程序员来说需要不断完善自己的知识库,如果不及时更新自己的知识库就会被行业所淘汰,没办法应对多变的行业。
计算机组成原理,编译原理,计算机网络,数据结构……大学期间的课程五花八门,有些课程晦涩难懂,很多人都觉得,学这些有用吗,这些不都过时了吗,我只要掌握行云流水的编码能力,一气呵成的框架体系,写一手漂亮的代码,不就行了吗?但并不是这样。
难点二:知识点多、杂
就拿Java来说,知识点特别分散,细节也非常多,不太容易记录,而且还经常学了就忘了,这就要求大家具有很强的逻辑思维能力,能建立一套自己的知识体系,捡重点学习,精准学习。
难点三:框架搭建
编程并不是简单的将代码堆积,需要搭建框架,需要抽象数据模型,保证后期的功能平滑的扩展,不是生硬的堆积。解决的方法:多去研究现有的框架,多思考为什么要这么搭建,还有什么更好的解决方案,慢慢框架的思想在大脑中就会慢慢的建立。
增删查改是程序员基础的不能再基础的能力,这个阶段之后就要提升自己的技术能力,看底层代码是如何实现的,如果真的遇到框架问题是不是有能力去解决。一定要学会主动学习,多跟进一些新的技术才是保持职场竞争力的关键。具体进阶学习如下:
一些经验之谈:
分享之前看到的一个观点:
编程一点都不难,它只是和你十几年来在学校受的教育格格不入而已。
自小你受到的教育总是:第一步,记忆和理解一个个知识点;第二步,给你一个未完成的拼图,让你把自己记忆的某几个合适的知识点放进去(超过3个知识点就是难题,超过5个就是高考数学的最后三道大题压轴了),对了就是满分!
有一个人总结了软件开发中无法规避的四个难点:复杂度、一致性、可变性、不可见性
这个人就是IBM大型机之父,Frederick Brooks.
复杂度:
规模上,软件实体可能比任何由人类创造的其他实体还要复杂,因为没有任何两个软件部分是相同的。如果有相同的情况,我们会把它们合并成共调用的子函数。
数字计算机本身就比人类建造的大多数东西要来的复杂,由于复杂度,团队成员之间的沟通非常困难,导致产品开发中会出现很多问题,使成本超支、进度跟不上;复杂度不仅带来技术上的困难,还会引发很多管理上的问题,它使全面理解问题变得很难,从而妨碍了概念上的完整性。
一致性:
工程师必须控制的数据很多是随心所欲的、毫无规则可言的,来自若干必须遵循的人为惯例和系统。它们随不同的接口而改变,随时间的推移而改变,而且这些变化不是必须的,仅仅由于它们是不同的人设计的结果。
某些情况下,因为是开发最新软件,所以它必须遵循各种接口。另一些情况下,软件的开发目标就是兼容性。在上述的所有情况中,很多复杂性来自保持与其他接口的一致,对软件的任何再设计,都无法简化这些复杂性。
可变性:
所有成功的软件都会发生变更。当人们发现软件很有用时,会在原有的应用范围的边界,或者在超越边界的情况下实用软件。功能扩展的压力主要来自那些喜欢基本功能,又对软件提出很多新用法的用户们。
简而言之,软件产品扎根于文化的母体中,如各种应用、用户、自然及社会规律、计算机硬件等等。后者持续不断的变化着,这些变化无情的强迫着软件随之变化。
不可见性:
软件是不可见和无法可视化的。软件的客观存在不具有空间的形体特征。当我们试图用图形来描述软件结构时,会发现它不仅仅包含一个,而是很多相互关联的、重叠在一起的图形。
除去软件结构上的限制和简化方面的进展,软件仍然保持着无法可视化的固有特征,从而剥夺了一些具有强大功能的概念工具的构造思路。这种缺憾不仅限制了个人的设计过程,也严重阻碍了相互之间的交流。
普通人怎么学习编程?
方法很重要,可以尝试看视频,找到有效的学习方法,这样学起来会如鱼得水。现在很多人刚开始都是看免费的基础视频,边看视频边跟着操作,学起来比看书要简单。
具体的学习方法如下:
Github——你是我的神 !
1、随手收藏的一些开源的电子书:
2、一些适合新手的入门项目,大家可以参考着学习:
3、一些github的其他学习资源:
英语不好能不能学编程?
对于编程入门的人来说,英语的影响并不是很大。因为编程过程中会出现的那些英语单词其实都不难,很多人看久了以后就认识了,并不会影响编程工作。
如果你的英语不好,在这个阶段,可以找到那些编程中需要的专业英语单词,然后把这些词记住,就可以应付绝大多数情况。
但是等你学到一定程度之后,还是需要学好英语的,因为一些不错的文档和资源都是国外的文献,所以为了今后提升编程能力还是好好学。
遇到不会的问题怎么办?
学会使用 Google 为什么也成为了必要。在你学习,开发的过程中会遇到很多的问题,这个时候会经常用到搜索工具。
在编程领域,英文资源比中文资源多了不是一星半点。比如 stackoverflow(一个编程的问答网站)几乎包括了你学习编程时会遇到的各种问题的答案,以为这些问题很早以前就有人遇到过了。所以,遇到编程问题时,记得使用英文在 Google 上搜索答案。
很多人都能写 140 字的微博,但一部 140 万字的书,绝不是一万篇微博拼凑出来的。篇幅越长,结构就越重要,写作难度也越大。
编程也是如此,写小一段代码容易,但写一个大型软件很难。
现代的商业软件,轻轻松松就是几十上百万行代码的量级。即便抛开性能、易用性等目标不谈,单是把这么多代码组织起来,让它们能作为一个整体正常工作,并且支持灵活地修改和增添功能,这就已经是一个巨大的挑战了。
谢邀,编程难在思维转变
首先要从现实思维转变成计算机思维,利用计算机语言,编写特定功能的程序
比如用C语言描述一个链表
首先,你要理解什么时是链表?就是利用计算机离散空间的存储结构。
好的,然后转化成C语言,如何向计算机申请一段空间,如果把很多段空间连接起来。
这里面就要理解什么是指针,什么堆内存。
好的,现在连接起来了,成了一段链表了,怎么去遍历,插入,删除,修改。
写到这里,一个简单的单向链表就搞定了。
然后就是双向链表,循环链表。
这些搞定了,你还可以试试如何设计一个限制总大小空间的链表,比如一个100mb的链表。
怎么管理空间,超过限制怎么删除。
好了,这里面所有内容都用计算机语言去描述,需要利用计算机语言里面的控制语句,循环语句,来实现你的目的。
到这里,你仅仅只学会了编写数据结构。
转到工程上,仅仅一个数据结构只是最基本的,编程你还得具有工程思维,搞得懂需求,以及对需求的全面考虑。
比如我要在网页上展示一个头像。
头像肯定是一个图片,一个<img>标签
首先就是前端
然后就是后端
可能还有思考不全面的,这些需求仅仅是对应了一个,展示头像
需求的难点过了
还有架构的难点,前端后端选型什么框架,如何组织代码,如何管理代码,如何拆分业务,人员如何配备,如何测试,如何验收,验收标准是什么。
学会了,编写数据结构,你是一个合格的计算机学习者
学会了,编写特定需求,你是一个合格的程序员
学会了从全局思考到特定需求,学会思考架构和人员了,你开始具有了架构师的思维,中间可能还会遇到高并发,大数据等各种问题。
别小看每一步,每一步都是经验和项目的积累,代码质量也是在对自己严格要求下慢慢提升。
可能还会学习不同语言,利用不同语言,解决不同问题。
编程其实是种思维方式,看你能不能做到:
能想明白这些,编程就不难。但是这3点要做到,不容易,需要学习:
当然后面还有很多,但是至少要学这点。
编程难在找不到对象,null pointer exception (NPE),真人真事儿。
本人就以Java为例来说明。
1 Java入门很简单,搭建个开发环境,然后运行个代码,就能看到效果了,皆大欢喜,从这意义上来看,编程及其容易。
2 要把Java学到能找到工作的程度,不容易,但根据网上给出的流程也能做到。
3 但是,如果单靠自学Java,然后以此找到工作,极难,话说回来,如果找到第一份能提供java项目实践经验的工作(不管用什么方式找到),后面提升起来就相对容易了。
其实大多数人学java,绝对不是为了兴趣,而是为了找工作,所以能面向大多数学java人的回答其实是第3点,即单靠自学,找到java方面的工作极难。
看到这里可能不少朋友会有疑问,java从入门到找工作的学习路线是现成的,相关书和视频也很多,而且找工作方面的准备简历和面试方面的技巧也有很多文章,那为什么靠自学很难找到java方面的工作呢?原因是时间和精力。
比如应届毕业生,大四学生一般要做毕业设计或者实习,一般是会从大四下学期开始才找工作,而7月就要离校了,一般如果到5,6月还没找到工作就会慌了,所以留给零基础应届生学java然后找工作的时间一般不会超过3个月。
其实大家也都知道,3个月时间看似不短,但学java的坑太多,就连刚开始的搭建开发环境步骤,如果没人帮忙,还真有可能一周搭不成,而在学习时,遇到任何一个语法点卡住,就有可能耽搁1,2天,这还不算去学不该学技能的时间。
而且找工作至少得留下一个月吧,在简历和面试技巧没问题的前提下(大多数零基础的java程序员做不到这点),一个月磕磕碰碰勉强能找到工作,更别提遇到简历或面试问题。
再说工作后零基础转行java,这些人由于平时还要上班,只能利用晚上和周末学,学习时间还比如在校生。对零基础想转java开发的这些人来说,虽然没有时间限制,但在学习过程中遇到问题,或者遇到工作忙,更容易放弃。
或者哪怕毅力再好,每天都坚持个学习,也会遇到“学习技能”和“面试技术”脱节的问题,造成的后果是学了3个月,看似了解了一大堆语法,但还是做不了项目,甚至还不知道java面试会问什么。这样学习的结果往往是学习时间被拖长,然后最后不了了之。
或者大家换个角度思考下,如果靠自学,很容易就能入门Java并找到工作,要这么多java培训班干嘛?本人这里无意为任何培训班站台,但出于让大家能准确到评估通过自学找到java工作的难度和工作量,所以说这样个情况:对于目前品牌比较好的培训学校,其中的学员哪怕是找到工作,其实也是勉强地靠面试话术通过面试,而且不能说所有的人都入行。而对于那些品牌一般的培训班,出现投诉和纠纷,不能说没有,而且也更不能确保所有的学员都找到工作。
出钱买了培训班的技术和就业服务,零基础入行还比较艰辛,更别说靠自学入行了。下面就具体说下靠自学入行java,并最终能找到工作的难度。其实这些情况大家稍微打听下或稍微实践学习一下java就能有同感,本人绝无夸张的程度。
1 第一关无疑是搭建环境,搭环境包括建jdk环境,IDEA集成开发环境,数据库环境,建maven,外带能下载pom包。很多初学者能搭建jdk、IDEA集成开发环境和数据库环境,但建maven同时配置pom环境就做不成了,这方面估计能让约10%初学者止步。
2 第二关是学Java语法,包括集合,面向对象,多线程和IO等的语法。这一块学起来倒不难,但很容易把初学者拉进误区,或者导致初学者学了不该学的技术。
比如常规Java书语法书,包含了IO,socket编程甚至是界面编程等技能,这些技能其实在项目开发里是用不到的。而且,java语法技能,照着书上的代码敲一遍然后学,快的话可能半个月,但如果中间敲的时候遇到问题,或者是过于拘泥于语法,会发现用1,2个月(甚至更多时间)学的语法点,其实真用不到项目开发里。
甚至我还真见过,用2个月时间学好java语法,也运行通了一些小游戏和基于界面编程的案例,依然是一头雾水。也就是说,学java语法就会让一些初学者学习上走弯路,或者是用2个月,甚至更长的时间才学完,之前也说了,留给初学者入门Java的时间并不多。
3 第三关是web框架开发。其实甚至有不少人,在学好java语法后点错科技树,去学ssm,或者是界面开发,或者是其他用不到的技术。
学这个不容易,因为spring boot等框架的运行环境不容易搭建,第二这里如果出现任何一个配置问题或者依赖包版本问题,就会阻塞住学习。
有工作经验的人事后想想,在找工作前,Spring boot只需要学整合数据库做增删改查业务的相关技能,但初学者未必知道,往往还会深入学习分布式组件,或者深入学习ioc等技能,这样的话更会因为学习难度提升从而失去学习信心,或者是拉长学习进度。
这样说吧,假设有100个想通过自学入行java,在3个月后,或者时间再拉长些,4,5个月后,能完成学习spring boot+JPA这个找工作必备技能的人数顶多就20个人,剩下的人估计在学习过程中就放弃了,或者因为遇到开发环境、语法或配置文件方面的阻碍性问题,同时没人帮助,从而无法继续学习。
但哪怕是学到这种程度,其实离开找到工作,还有一段距离,因为掌握了工作必备的技术是一方面,通过简历和面试向面试官证明能力,从而找到工作,这是另一方面。
而java初学者哪怕是学好了 spring boot+JPA技能,在找工作时往往还会出现如下的问题。
1 简历上无法证明自己的java开发经验,或者是写的项目经验一看就是学习经验,这样的简历根本没有机会得到面试机会。
2 在面试时着重背八股文,而无法证明自己spring boot的项目经验,而且在屡战屡败的情况下还不知道该怎么提升。
所以假设有100个想通过自学入行java,最后能靠自己的能力,边做边试探,然后找到工作,估计顶多就10人,甚至更少。
写了这么多,做个结论,靠自学java然后成功找到工作,不容易,如果再要加个限制条件,通过自学java,在有限的3到5个月内找到java工作,更不容易,难点有哪些呢?
1 难点不在于缺乏资料,缺乏学习路线,而是资料和学习路线太多,从而导致初学者把大量珍贵的学习时间用在不必要学的技能上。
2 如果靠自学,没人在边上辅导,可能学习过程中步步是坑,而且不知道怎么解决,这可能会让学习过程不了了之,或者是延长学习时间。
3 学习难度本身就不小,而面试找工作的难度更大,这块甚至不少初学者连为什么简历没人回,为什么面试每次都失败的原因都不知道。
4 对于已经有工作经验的人来说,转行java时,面试官更要确认之前的java相关经验,没的话基本面试不会成。所以对那些已经工作但想转java的人来说,证明之前的java项目经验尤其是个难点。
而且上述的难点,绝非本人危言耸听制造焦虑,大家只要尝试性地用一周时间学习下java,哪怕是学习下java的最简单的集合或面向对象方面的语法,就会感到上文列出的学习难点是所言不虚。
英语更少,只有26个字母。
数学更更少,只有0-9。
其实c语言的128个字符还是有点多,不如学机器码吧,只有0和1。
作为一名计算机专业的教育工作者,我来说说我的个人看法。
首先,我并不认为编程语言难学,在所有的计算机专业课当中,编程语言是最容易学习的课程之一,同时编程语言也被认为是打开计算机技术大门的钥匙。
编程语言容易学习并不意味着编程就容易,实际上编程确实有难度,因为程序涉及到逻辑、算法、数据等一系列知识,掌握了基本的编程语法并不意味着就能轻松解决各种编程问题,大部分优秀的程序员也都需要一个积累的过程。
对于初学编程的同学来说,难点在于理解编程语言当中的各种“抽象”,要想突破这个难点,一定要多做实验,通过实验来为各种抽象概念建立起画面感,这是比较重要的。
理解了编程语言当中的“抽象”,就会逐渐掌握基本的编程流程,同时形成一个初步的编程思想,这个阶段要通过场景实践来积累编程经验,本科生同学要多参与科研实践和项目实践活动,参加专业竞赛同样能够提升自己的编程能力。
对于已经具备了一定编程基础的同学来说,要想进一步提升自身的编程能力,应该明确一个自己的主攻方向,提升对于算法和数据的认知能力,这个过程不仅仅要掌握一些编程语言的底层逻辑,更需要掌握如何运用编程语言来完成算法的实现、训练和验证。
其次,随着云计算、大数据和人工智能等技术的发展,目前在应用层面的编程难度已经越来越低了,基于云平台的编程门槛也在不断下降,尤其是在当前低代码平台的推动下,很多非计算机专业的同学也可以完成一些业务场景的编程任务,这是一个大的发展趋势。
最后,如果有编程相关的问题,欢迎与我交流。
难在坚持,难在克服急于求成,难在不学习算法,只学语法。