V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Leslie5205912
V2EX  ›  程序员

新手程序员写项目疑问

  •  
  •   Leslie5205912 · 2020-03-07 00:24:31 +08:00 · 3645 次点击
    这是一个创建于 810 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在大三,然后有在网上接到项目赚点外快,项目大概涉及的就是 linux 端 sdk 的对接使用,c/s 架构,用到的开发工具是 qt,linux 端语言也是 c++,以及用 python 当作胶水 其实这些我都是依样画葫芦做出来的,碰到啥不会,比如 qt 怎么创建一个 server 实例,怎么去继承 qtcpserver,怎么重写 incomingConnection 函数,以及现在做到的怎么对接阿里云,用到的 opencv 怎么去识别人脸,python 怎么去调用 c++.so ,这些都是网上直接找 demo,然后修修改改,现在就是做出来的东西稳定性不太行,会经常出来一些意想不到的错误,但是大多数都能解决,但是就是没办法一次写成那种 bug 很少的程序,以及很多东西网上找不到 demo 我就没办法自己创造了,想知道程序员是不是就是这个工作模式还是应该去学好基础一步一步向上?还是说这种东西做久了,有经验了,吃的苦头多了,以后写出来的程序稳定性也高了? 其实有时候也在想自己到底适不适合这个职业,其实我大学 3 年一直在想,一个是大家都在说的确实很累,但是想想其实哪个职业不累呢,一个是碰到 bug,碰到走不通的路,我有时候真的很想放弃,写程序兴趣是有的,实现一个功能,我都会很开心,相反,测试给我疯狂发 bug,这种时候心情就会差到极点 想知道你们的成长途径是怎么样的? 我现在定的方向是以后做音视频应用开发,在看雷霄骅写的 ffmpeg 相关博客,不怎么看的懂哈哈

    29 条回复    2020-03-07 17:46:59 +08:00
    rapiz
        1
    rapiz  
       2020-03-07 00:34:00 +08:00
    遇事不决看文档
    Leslie5205912
        2
    Leslie5205912  
    OP
       2020-03-07 00:38:41 +08:00
    @rapiz 只看文档的吗都?
    felix021
        3
    felix021  
       2020-03-07 00:43:03 +08:00   ❤️ 2
    建议
    1. 把 算法、数据结构、操作系统、计算机网络、数据库 这几门核心课程吃透
    2. leetcode 多刷题,200 道起
    3. 阅读一些架构类的书籍,例如 headfirst 设计模式,大型网站技术架构
    4. 刷一些面经
    5. 找个实习(尽量是大厂),然后到大厂至少待两年
    janus77
        4
    janus77  
       2020-03-07 00:43:18 +08:00 via iPhone
    世界上没有无 bug 的程序,写多了就越来越少了。改过的 bug 要记住减少再出现的可能性
    Leslie5205912
        5
    Leslie5205912  
    OP
       2020-03-07 00:54:56 +08:00
    @felix021 算法刷过一年 acm,数据结构自认还学的不错,计算机网络不想看底层的什么链路层这些的,只想学应用层,操作系统和数据库一般,leetcode 应该有 200 了,架构类我确实可以去看看,第三点我基本都没听过,大二暑假在创业公司实习过,被坑了一天才一百还累,不过经验确实有积累
    Leslie5205912
        6
    Leslie5205912  
    OP
       2020-03-07 00:57:38 +08:00
    @janus77 确实,如果自己写的程序不会出现那种严重性的 bug 真的会好开心
    aabbcc112233
        7
    aabbcc112233  
       2020-03-07 01:03:45 +08:00 via Android
    基础打牢固,先用常规套路干活,不要自己想着乱来,多学习设计模式和项目架构。
    tomczhen
        8
    tomczhen  
       2020-03-07 01:17:27 +08:00 via Android   ❤️ 1
    软件工程是实践类型,虽然会包含技巧类型的算法,但是想把工程实践做好,还是需要实践经验。实践经验可以通过直接参与项目获得,也可以通过一些分享渠道获得,典型的比如设计模式等等,而练习算法对提高实践经验没有帮助,不如弄本≪代码大全≫看看,顺便吐槽下书名的翻译。

    在实际项目中,代码结构不那么优雅,实现丑陋是很正常,很合理的结果。既然是工程,那么就要考量成本,在成本内实现可接受的结果就是成功的项目,提供超出预期的成果,比如可维护性等等,额外付出成本终归还是要有人承担。

    从功能上讲,核心部分决定项目价值,以你的项目为例,核心功能应该是 OpenCV 的识别算法,至于 gui 那边,有 bug 很正常。因为如果 OpenCV 这块无法满足要求,其他部分再怎么完美也是不可接受的。
    felix021
        9
    felix021  
       2020-03-07 01:22:58 +08:00
    @Leslie5205912 基础还是要补一补,你不知道底层的大致原理,做应用层遇到问题,往往会没有思路,无法解决。到大厂历练两年,看看工业界的实践,无论是技术,还是方法论,都会让眼界开阔很多,到时候这些问题都不会困扰你了。
    Leslie5205912
        10
    Leslie5205912  
    OP
       2020-03-07 01:43:47 +08:00
    @felix021 好的谢谢你,我道路清晰很多
    Leslie5205912
        11
    Leslie5205912  
    OP
       2020-03-07 01:46:11 +08:00
    @tomczhen 好的,明白了,多吃点 bug 的苦,我会去研究研究设计模式,这个本来确实不在我的视野范围内,我本来定的就是研究熟悉 ffmpeg,然后做点相关的项目就去当个视音频应用开发工程师
    cassyfar
        12
    cassyfar  
       2020-03-07 02:16:52 +08:00
    找个大厂进 这样你复制粘贴得就是大神们的代码 然后抄作业抄熟了 你也就 bug free 啦
    xdtr
        13
    xdtr  
       2020-03-07 09:09:52 +08:00
    “网上直接找 demo”,这个不怕,都是这么过来的,关键是得知其然也要知其所以然
    “没办法一次写成那种 bug 很少的程序”,多写代码多 debug 就好了,这就是个经验问题
    多做笔记,小黄鸭调试法,力扣刷题提升姿势水平,慢慢来不要急~
    yangzhezjgs
        14
    yangzhezjgs  
       2020-03-07 10:33:24 +08:00
    给你几点建议:
    1 补计算机基础,推荐你去看袁春风的《计算机系统基础》和袁老师在中国大学 mooc 上的网课,这门课是本土化的《深入理解计算机系统》,引用一下它的授课目标:通过本课程的学习,使学习者能从程序员角度认识计算机系统,能够建立高级语言程序、ISA、OS、编译器、链接器等之间的相互关联,对指令在硬件上的执行过程和指令的底层硬件执行机制有一定的认识和理解,从而增强在程序调试、性能提升、程序移植和健壮性等方面的能力,并为后续的“计算机组成与设计”、“操作系统”、“编译原理”、“计算机体系结构”等课程打下坚实基础。
    2.补软件工程基础,推荐南京大学的教材《软件工程与计算》卷二,重点看看软件设计部分,会让你对软件可维护性,重用性等有更深入的理解。
    3.视音频可以看 imooc 网的实战课 https://coding.imooc.com/class/415.html,我对这方面不了解,只是恰好之前看到过,就推荐一下
    jinmaoi
        15
    jinmaoi  
       2020-03-07 12:00:02 +08:00
    只有写得多了,遇到的问题多了才能真正的明白这些玩意.我不推荐楼上这种直接让你看大部头书.只有写项目的时候发现自己薄弱点在这里然后有的放矢才能有效果,像我之前学网络原理的时候只是知其然,等到自己写 HTTP 服务器的时候反回去看才能做到真正的融会贯通.
    lewinlan
        16
    lewinlan  
       2020-03-07 13:18:41 +08:00 via Android
    抄别人的代码当然会『稳定性不行,经常出意想不到的 bug 』。
    想要代码稳定,最好的办法就是选一门靠谱的语言,自己造轮子,这样每个细节你都清楚。然后发现大问题就重构,重构个三四五六遍绝对够稳定了。
    当然,老板不会允许你这样做。所以实践中就是抄别人的然后不停地改 bug,习惯就好。
    Leslie5205912
        17
    Leslie5205912  
    OP
       2020-03-07 13:19:10 +08:00
    @xdtr 哈哈哈谢谢你我就想要点鼓励来着
    Leslie5205912
        18
    Leslie5205912  
    OP
       2020-03-07 13:20:10 +08:00
    @lewinlan 凭空写出来一项功能对我来说有点难,通常就是借鉴别人做好的 demo
    Leslie5205912
        19
    Leslie5205912  
    OP
       2020-03-07 13:21:53 +08:00
    @jinmaoi 确实,心态不同,而且总会想现在看的我到底用不用的到,反过来反而效率高点,我现在就是想确认我这样的走一条程序员的路对不对
    Leslie5205912
        20
    Leslie5205912  
    OP
       2020-03-07 13:23:00 +08:00
    @yangzhezjgs 谢谢我会借鉴的,第二点我会去看一下,计算机底层涉及到什么信号这类的我就头疼哈哈哈
    lewinlan
        21
    lewinlan  
       2020-03-07 13:24:02 +08:00 via Android
    @Leslie5205912 借鉴思路是必须的,也是好的。我的意思是别直接拿来就用。如果是复杂的大型框架没办法自己撸的,至少看懂人家的源码
    Returnear
        22
    Returnear  
       2020-03-07 13:42:38 +08:00
    函数 -> 功能 /特性 -> 模块

    你现在复用了别人的模块,但是对功能都改不了,所以问题就出在这里了。

    如果要成为一个合格的开发,至少以函数作为最基本的复用单元。
    Leslie5205912
        23
    Leslie5205912  
    OP
       2020-03-07 13:51:09 +08:00
    @lewinlan 这个当然哈哈,不然和没写一样
    Leslie5205912
        24
    Leslie5205912  
    OP
       2020-03-07 13:55:27 +08:00
    @Returnear 这个倒是没有,我的意思是没办法凭空写出来,拿到别人的代码我是能分解出有用的函数的,不过如果这个函数的传参和 return 没办法直接放入我的代码,比如有做到 rgb24 转 jpeg (说实话这个真的看不懂,我就直接抄了,能运行就行),后来怎么都有问题,就转为用 opencv 直接保存 jpg 了
    gavinjou818
        25
    gavinjou818  
       2020-03-07 14:38:50 +08:00
    虽然没有一直大学都没有实习过。但是感觉很多时候也有楼主一样的矛盾,自己想实现功能,但很多时候并不知道怎么下手,然后就是在网上找人家代码,写写,然后搭起来一个烂架子。虽然能跑,但是很不稳,各种问题出现再去重复的查找。
    但是感觉多次复用理解之后,也能按葫芦画瓢的做出来。做软件程序给我的感觉,就是一种形式;并不像打 ACM,你可以把你的想法灌进去,然后看到 AC 的开心。
    但是你找的也是人家积累的帖子,说明了什么呢,大家的工作模式都应该基本一致,都是这样一点点积累下来,所以楼主我觉得你遇到的 bug 也自己攒一下,攒得多了,以后也就行云流水程序更稳定了,写出更优雅的代码了。至少俺是这昂想的,看书为辅,实践为主。打 ACM 不也是一点点从 a+b 搞起来的,一样也有 bug,一样也有让你爆炸的时候。
    jianghu52
        26
    jianghu52  
       2020-03-07 14:39:55 +08:00
    有一点我看大家没有说到,我补充一下.测试给你疯狂的发 bug,你不能对应完了就完了.要把这些 bug 都找出来,总结一下,有哪些是因为你的考虑不足出的错误,有哪些是你的知识不到位,出的错误.哪些是因为文档没有写,你也不知道出的错误.
    这么总结一圈下来,你最少能在一个项目上,看到自己的不足之处,然后针对性的去学一些东西.
    个人认为,软件工程分两大部分.
    1.技术积累.简单来说,如果你对这个项目所用到的语言特性非常了解,对应优缺点都心里有数,项目有什么需求,你都可以有现成的提案.那么对于一个项目来说,能在技术上学到的就是这些了.
    2.业务积累.简单来说,你不在是一个开发者,而是一个使用者.为什么要做这个功能,是什么痛点让客户提出了这个功能,这个功能是不是最好的解决客户痛点的方式,客户可能还有哪些痛点,能不能有更好的方式解决客户的痛点.随着你提的问题越多,你能从业务上学到的东西就越多.所以业务层面的积累相对来说会慢一些,通常我们得闲到一点程度,才能有时间体会这些.
    至于你说的没有 bug,或者被人疯狂提 bug,这种挫败感是完全没有办法避免的.
    Leslie5205912
        27
    Leslie5205912  
    OP
       2020-03-07 15:11:07 +08:00
    @gavinjou818 可能这就是程序员不得不积累的项目经验吧!共勉
    Leslie5205912
        28
    Leslie5205912  
    OP
       2020-03-07 15:14:34 +08:00
    @jianghu52 真的碰到 bug 才知道自己有好多不足
    newmlp
        29
    newmlp  
       2020-03-07 17:46:59 +08:00
    基础很重要,不然碰到问题就瞎了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1139 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.