jjzjj

最近在学C语言,非常痛苦,怎么办?

无际单片机编程 2024-07-04 原文

来讲讲我的经历吧…

我非计科专业,2011年毕业于电气工程专业…

当时觉得这个专业没钱途,也不适合我,就计划着转行。

那个时候也很焦虑和迷茫,白白浪费几年时间,最后又得重来,真是造孽..

年纪轻轻就开始感叹人生真特么的坎坷。

焦虑和迷茫了一个多月,除生活变得更糟,别无变化。

心里也焦急,再这么下去就废了。

出于我性格比较内向,可能比较适合做个程序员。

加上自己从小家里就有电脑,初中把各种游戏玩的很溜,像CS、泡泡堂、传奇之类的,也自己租服务器开过传奇sf,给自己刷了一套终极装备去虐普通玩家。

虽然有一些优势加持,但实不相瞒我最看重的还是程序员工资真香。

刚出学校出来,思维也没现在成熟,学习也盲目,工作多年才知道要根据职位需求去规划学习路径

我第一次是学习的java,先自学了java se基本语法,又学了oracle。

学完了感觉还是啥都不懂,跟着视频教程写了个坦克大战游戏,还发给朋友炫耀一番,其实low的一逼。

脱离教程,似乎一切都归零了…时间已经不知道过去了多久,反正至少按月计算。

我又开始陷入那该死的迷茫期,这水平能找得到工作吗?

后面又深入研究了职业方向,发现学完java se只是刚刚开始,只是基础。

想达到就业程度可能要需要从2个方向选择:java me和java ee。

一个做手机应用,一个做Web和企业级应用,具体是不是我也是很懂,因为后面我没继续学了。

学尼玛,感觉学完都要退休了,看来高薪也不是这么好拿的。

再次陷入迷茫期,我都想着要不要先进厂拧螺丝维持生活,积累点工作经验。

如果你现在面临这个阶段,我建议是千万不要!

一进去人基本就废了,人一但稳定下来,就很难折腾得起来。

如果实在没钱吃饭了,就先找个清闲的工作,哪怕是当保安也比进厂打螺丝强,保安起码时间多啊,可以利用空闲时间学习。

进厂跟机器人没区别了,无情地被厂长压榨,不可能让你停下来。

后面,我无意间接触到单片机,这个简单,编程语言只需要学习C语言。

关键这玩意对你学习成果反馈也很快,几个小时就能让你做个看得见摸得着的流水灯,也比纯粹的写代码有趣多了。

我就是从那时候开始接触的C语言,直到找到工作以后,我的c语言都是浑水摸鱼的水平。

现在11年过去了,我的水平也增长明显,自己写过架构、实现过队列、链表之类的数据结构。

我对自己的要求就是,既然我做单片机开发,基于单片机产品的程序我能独立做出来就够了。

现在做到了,不跟那些大佬比了,躺平了,承认自己平凡挺好

回顾我的成长历程,估计可以写一本书,毕竟我输出的原创经验已经超过10万字。

下面,我做针对今天的主题,做一个总结。

C语言编程水平提升,你必须会经历的几个阶段:

1.新手期

就是你刚接触c语言,学会了基本的语法但你会发现什么项目都做不出来。

可能只会一些简单的,比如排序算法,各种printf,单片机各种外设使用。

但是把代码整合在一起,实现项目功能逻辑就一脸懵逼。

这个时候,你就会进入一个新手瓶颈期。

这个时期你会特别敏感,会质疑自己哪里没学好,是不是基础太差。

你可能会选择重新去把c语言过一遍,像翻女友旧史一样去查阅市面上一些c语言教程。

还有一种可能,就是你觉得自己不适合学编程,最终放弃了。

我当初学java就是第二种,学完啥都做不出来然后放弃了,其实跟基础没太大关系,没必要再重头学一遍c语言语法,学完你会发现还是一样

其实你现在最缺的是两样东西:编程思维编程水平

编程思维决定你是否有实现功能的思路,编程水平决定你能否用代码实现这个思路

这两个东西只能不断通过项目去培养,就像你刚学会写字,不可能马上就会写作文对吧?

那些不理解我们无际单片机编程特训营的,明明买个单片机开发板学习才百来块,我们却收费过千。

就是因为开发板只能让你学会c语言和单片机这些工具,并不培养你的编程思维和水平,我们是以实际项目驱动,定位价值也不同。

2.破茧期

如果你想通了,就能顺利到达这个阶段。

这个阶段最好的方法就是找各种项目来做,不通过项目你的编程水平永远也提升不了

前面也不追求项目代码能写多好了,能实现功能就可以了。

拿单片机开发来举例,这个阶段不用再买开发板了,要买就买项目,某宝有很多DIY的可以买来练手。

开发板和项目都是电路板,区别就是开发板引出单片机所有外设,你漫无目的地整吧..

项目是有特定的产品功能,你学习更有目的性。

这个阶段对自己要求也不要太高,不需要纠结代码写得好不好,主要以实现功能为主

3.破茧瓶颈期

等你有60%的项目都能独立写程序做出来以后,你会再次进入一个瓶颈期。

我经历这个阶段是在工作了2-3年左右,当时有点飘了,感觉自己什么项目的代码都不怕了。

但是有一个问题,就是总是感觉自己的代码乱七八糟的,不够专业。

虽然我当时还不知道好的代码应该是怎么样的,毕竟没接触过。

用我现在的理解,代码写得好不好主要体现在两方面:架构算法

架构相当于你程序的”地基”,架构不好,会影响你代码的稳定性、功能可扩展性、代码在不同平台(芯片)的兼容性

算法就是你去实现某种功能的方法,很多算法都是先用数学公式计算好,再用代码去实现,算法越好,执行效率越高

如果没人跟你说,现阶段的你根本领悟不到这两点。

我当时就是碰到这个瓶颈,但不知道怎么去提高。

只是用了一些花里胡哨的方法,让我的代码看起来更专业,比如说明明可以不用指针,我用了,只因为指针看起来更复杂。

4.快速提升期

如果有个牛逼的工程师带你做一些中大型项目,就能迅速突破。

不过不是每个人都有这种机遇,比如说我就没有,所以我在这个阶段停留了几年的时间

做小项目还没用,必须得接触中大型项目。

只有经历过中大型项目,你才能深刻理解程序架构的重要性,理解指针的奥妙等等你能学到的东西太多了。

无际单片机编程的课程第三阶段项目定位就是帮学员突破这个破茧瓶颈期。

项目有自己写的小系统,无线传感器组网功能,有菜单功能、可以通过APP控制主机状态,有防盗报警功能等等。

重点培养功能实现思路,锻炼编程水平,用c语言高级语法解决实际产品开发的痛点。

5.架构师

这个阶段你的水平其实已经很不错了,除了编程水平,更多是在思维上的提升

比如说模块化思维,面向对象编程思维。

你可以自己写一些程序架构,不一定要从头到尾自己写,还是会有难度。

一般都是先模仿别人的架构,然后再超越,哪怕是顶尖的都是这样过来的。

类似的程序架构有很多,拿单片机开发来说,RTOS、蓝牙协议栈、STM32固件库等等都是可以的。

我在2019年也录制了一套系统的程序架构的视频教程,基于单片机的,算是我多年的经验总结,可直接移植到自己项目使用,最重要的是完全开源!完全开源!完全开源!

这里不方便放链接,直接找无际单片机,全网同名的。

 

不知不觉又肝了2600多字,虽然是一篇文章,也更像是我的回忆录。

 

如果对你有帮助,发财小手点起来,给我安排个三连,感谢!

有关最近在学C语言,非常痛苦,怎么办?的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

  4. ruby - 怎么来的(a_method || :other) returns :other only when assigning to a var called a_method? - 2

    给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R

  5. ruby-on-rails - 我该怎么办 :remote location validation with CarrierWave? - 2

    我在我的Rails3示例应用程序上使用CarrierWave。我想验证远程位置上传,因此当用户提交无效URL(空白或非图像)时,我不会收到标准错误异常:CarrierWave::DownloadErrorinImageController#createtryingtodownloadafilewhichisnotservedoverHTTP这是我的模型:classPaintingtrue,:length=>{:minimum=>5,:maximum=>100}validates:image,:presence=>trueend这是我的Controller:classPaintingsC

  6. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  9. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  10. ruby - EventMachine - 你怎么知道你是否落后了? - 2

    我正在研究使用EventMachine支持的twitter-streamruby​​gem来跟踪和捕获推文。我对整个事件编程有点陌生。我如何判断我在事件循环中所做的任何处理是否导致我落后?有没有简单的检查方法? 最佳答案 您可以通过使用周期性计时器并打印出耗时来确定延迟。如果您使用的是1秒的计时器,您应该已经过了大约1秒,如果它更长,您就知道您正在减慢react器的速度。@last=Time.now.to_fEM.add_periodic_timer(1)doputs"LATENCY:#{Time.now.to_f-@last}"@

随机推荐