找回密码
 立即注册

学习编程时感觉很有趣,到做项目时就不知道从何下手了怎么办?

5
回复
153
查看
[复制链接]

21

主题

29

回帖

92

积分

注册会员

Rank: 2

积分
92
来源: 2023-12-21 09:55:55 显示全部楼层 |阅读模式
单词记不住,思路也忘记快。
回复

使用道具 举报

6

主题

26

回帖

24

积分

新手上路

Rank: 1

积分
24
2023-12-21 09:56:44 显示全部楼层
编程学习中遇到的问题,是有确定解的问题。像是在做参考书,后面总有正确答案。你可能不会,可能做不出来,但不用担心方向对不对,不担心这个题有没有解法。
而单独做项目时,你遇到的问题可能是无解的,花了大量的时间研究,结果发现这个问题不成立,方向是错的。没有能力去问出有效的问题,甚至连搜索的关键字都没有听说过,所以会一筹莫展,不知如何下手。
前者像做题,勤奋点就可以学深学透,后者像是创造,凭空写出个东西,既要设计,又要实现,会触碰到大量的知识盲区,比单纯的学习难多了。
不用说初学者,很多工作好几年的程序员,也没有单独启动过一个项目,只是在自己熟悉的领域内当专家而已。
回复

使用道具 举报

18

主题

36

回帖

84

积分

注册会员

Rank: 2

积分
84
2023-12-21 09:57:44 显示全部楼层
为什么学编程有趣?

做任何事情,如果能感受到「有趣」,不外乎两个原因:

  • 这是个直接感官刺激让人舒适的事情。比如:看好看的电影、小说等。
  • 能收获到正反馈。比如:游戏里的经验值,知乎回答被点赞,学习过程答对一道题等。
在学编程的过程中感受到有趣,那是因为学习的过程是无数碎片(章、节、知识点等)构成的,而设计得好的课程,可以让每个碎片都给学习者一些正反馈,从而吸引人继续。
比如「Hello, World!」,虽然简单至极,但对第一次编程的人来说,能让自己亲手敲的代码成功运行,屏幕上出现「Hello, World!」,就收获正反馈了。
如果这时有人告诉他,可以把「World」换成任何词,包括自己的名字。这就是第一次「写」自己的代码了。那一瞬间,正反馈加倍。
如果此时,会猜想「Hello」能不能改呢?于是把它改成「I love you」。哇!成就感爆棚了有没有?
这样的正反馈,一个接着一个,让我们就像升级打怪一样地,越来越喜欢。
为什么做项目就无趣了?

因为做项目的反馈周期太长了。
一个完整项目的代码量少说也得大几千吧,一写就几周几个月的,不到见用户,根本不知道做得好不好。
而且,在这漫长的过程里,还有很多负激励。比如题主说的「单词记不住,思路也忘记快」。
这种情况其实很普遍。即便很有经验的程序员,也是要时不时找自己曾经写过的代码,拷贝粘贴用于新项目的。这绝不只是为了省事,而是因为不常用的技术点,很容易被忘记。
气人的是,不忘记,也是一种负激励。因为没忘,是因为常用。常用,说明在日复一日做重复的事情,这样很让人沮丧。
AI 编程可解 boring

AI 编程正好可以把「忘记」和「不忘记」这两个负激励,都解决。
以 GitHub Copilot 或 CodeGeeX 这类补全式 AI 编程工具为例,它们都能根据项目其它代码、注释,猜出你接下来想写什么,然后自动把代码给出来,你按下 tab 就能接受它的建议。
运气好的话,一直按 tab 就能把大片代码都写完。
这样,无论你是忘记的,还是没忘记的,反正它都能给你,你判断对错就好。
更重要的是,编程效率提升了。统计数据是能提升 55%。这让整个项目周期缩短,快乐也就增加了。
我现在已经完全依赖  AI 编程,而它让我的编程幸福感提升了很多很多。
我正好在知学堂有包含 AI 编程的公开课,主要分享以下三个知识点:

  • 这次 AI 技术,和以往的技术变革有何根本不同?
  • 在这种剧烈变革下,程序员的职业会发生哪些变化?
  • 如何让自己成为变化的受益者?
欢迎你来直播间,我们可以直接交流。同时我也给你准备了 AI 大模型相关的学习资料,也有助于你快速了解和学习大模型,让你编程能力实现质的飞跃。
回复

使用道具 举报

4

主题

26

回帖

35

积分

新手上路

Rank: 1

积分
35
2023-12-21 09:58:27 显示全部楼层
一方面上手实操太少,像我们大学学编程课,都是老师在黑板上神舞飞扬的讲解,听的云里雾里的,有些也觉得很新奇好玩,但是一周上机时间只有2次,从听懂到能做出来还需要很多实践。业余时间可以自己多琢磨、动手写代码。
另外做项目,这个也看不同的导师引导,项目流程比较完善的会从需求到设计到实施、优化都有一个清晰的步骤可以参考,拆解成一个个的步骤,做几遍也就熟悉啦,下次自己知道怎么入手开始做。没有指导的就是直接扔一个项目,告诉需求和结果,随着做随调整,感觉一堆杂事,做项目的人也会感觉很累。市面上有很多很好的这方面的书,选那种实操性比较强的,也能学起来。
好好利用编程的优点,确定性,反馈及时,只要你愿意去动手实践,就一定能看到结果和进步,做项目就是解决一个“大问题”,多思考,多尝试,忘掉传统的被动听,变成自己想主动去学习去做就成功了一大半,加油!
回复

使用道具 举报

4

主题

27

回帖

28

积分

新手上路

Rank: 1

积分
28
2023-12-21 09:58:54 显示全部楼层
编程有趣只是初衷,但离项目还很远

不同的人在学习编程的过程中,让他觉得编程有趣的刺激点是不一样的。
比如很多新手看到用命令行窗口输出一些数学运算题或者只是运行了一些基础的语法,就觉得编程很好玩;
比如很多学校教学里的编程,通常都只是把编程语言作为刷算法题的一个工具。尤其是原本非常简单的C语言,因为夹杂着大量算法题和习题,导致不少人望而却步,但有些学生会乐在其中;
比如现在有些自媒体为了吸引流量,在网上抄袭一些非常酷炫的代码,不少人就热衷于收集这些奇技淫巧;
还有人用一些可视化的编程语言如Scratch或可视化的界面操作,也能做出一些小游戏、页面或网站,也会觉得很有成就感;
如此等等,这些都不是项目,也离项目差的很远,花费再多时间也很难让你下手去做项目。
因为方向路径不同,原本简单的项目也会很难

如果你学习的是C这种面向过程的底层系统级语言,你要独立写一个看起来很酷炫的项目,这本身就很难;如果你学习的是PHP、Python、JavaScript或基于Java的Spring,哪怕是基于Swift的iOS开发等等面向对象有着十分丰富生态的偏应用型的语言,做项目都会变得简单很多。
大多数学校对编程语言的教学都是停留在编程语言基础语言、计算机基础知识或编程思想上,哪怕你学习了一两年的C语言、Java、C++,哪怕你是学校的优秀学生,基础课非常扎实,但是让你做一个项目,你也很难上手。这是因为国内的很多大学教学方式落后,你没有去自学,没有和同学组队做过项目,你做不了很正常。
项目难么?其实并不难。哪怕你是一个新手,你通过一两个星期的学习,也应该能够做出一些项目,比如写几个网页,上线一个网站,做一个简单的小程序或App,这些都是一两个星期就能掌握的,但是很多学生甚至计算机专业的学生,刻苦学习两三年都做不出一个项目。这是因为学习的目标、方向、内容不同罢了。
我是比较主张在大学一年级的学生,就应该掌握独立开发一个全栈项目(前端网页、小程序、或APP,后端不限编程语言)的能力,这也是美国计算机名校的一个基础要求。而国内的大学过于轻视写代码、做项目,这方面的课程《面向对象》、《软件工程》基本都放到了大二大三,而且严重缺乏实战。
你对编程以及项目的理解有误

从你的描述来看,你还没有掌握编程和项目到底是什么,比如你说单词记不住,编程本身对单词的依赖是很低的,而且根本不需要记,因为与语法相关的单词都可以通过编辑器和IDE来辅助,而且你也很难记得住那么多API,都是需要借助工具和文档。
思路也忘记快,不明白你说的思路是啥?给我的感觉就是你不知道该如何下手,你不了解软件工程,你没有实际模仿过一个项目?
应用类的项目基本都不是从零开始写的,都会有一套脚手架,只要快速启动模板,这个项目就初始化好了,只需要基于这个模板进行修改就可以了。
还是说你不太了解用编程语言如何增删改查数据以及数据与实际应用项目的关系?用编程语言开发项目,其核心就是将现实场景、功能抽象出数据,转化为简单的数据类型以及用编程语言来控制交互,控制数据的传递与渲染,也就是要掌握一个项目的开发,需要有UML、流程图、文档等工具来梳理思路,又怎么会存在思路忘记得也快?
回复

使用道具 举报

2

主题

28

回帖

7

积分

新手上路

Rank: 1

积分
7
2023-12-21 09:59:18 显示全部楼层
我也算是个半懂代码,但是一旦真正上手做项目就歇菜的。
你这个问题,我的直观感受是:
编程中你体会到乐趣的那些东西,并不是做项目所需要的东西。

举两个真实的例子。
第一个,我们在做一个基于opencv实现的人脸生成服务,接口实现是用的flask,为的是海量生成测试数据。
简单来说就是接口调用之后,返回一组新生成的人脸图片,但是要求每组中包含不同的模糊度(比如说1~10)。
一开始效果是很ok的,后来需求量级高了,我们就不得不做成并发。于是我调研了一下,在flask前面加了一个gunicorn之后就支持并发了。
但问题随之而来,每次返回的模糊度不再是1~10,而是随机的,比如1233569836。我立即就知道这是并发出现问题了,核心原因是生成图像的算法不是线程安全的(或者说该算法中的模糊度变量)。
你可以看出,线程安全这种鬼东西一定不是你会感到有兴趣的东西,甚至都不如opencv造人脸有趣,但是工程上你就是需要它,需要这方面的知识。

第二个,我们当时的项目是分析函数之间的动态调用链。
你可以理解成把java的覆盖率插桩改造了一下,把调用栈给录制下来,然后分析一个测试用例触发了哪些类和方法。这些数据是放在redis里面,希望快速存取的。
我当时的任务就写一个java程序,把redis当中的原始数据,分析之后,存储为新的数据放到hdfs。
我当时就犯了几个错误:
第一,尝试把redis数据全量读取到本机java进程内,再由java计算。然后我本机的内存立马不够了。
第二,每次由java进程读取1个or16个数据,进行计算得到中间数据之后,再写回redis。结果证明中间数据不仅需要额外计算,java到redis通信的网络开销,几乎是计算开销的十倍。

最后我能想到的合理方案是,直接写lua脚本在redis内,用java进程驱动远程redis自己计算,结果最后转存hdfs。如果谁有更好的办法可以告诉我。

你可以看出,整个项目实际上需要的知识点是:时间复杂度和空间复杂度权衡,网络传输与计算开销的权衡。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
商业洽谈 文章投递 寻求报道
客服热线: 400-113-0968
关注微信