RemannZRemannZ  2020-05-20 02:24 瀚宇文创 隐藏边栏 |   抢沙发  80 
文章评分 2 次,平均分 5.0

大家好,我是Rz

很多朋友出于各种原因向我请教如何开始学习编程。有的是因为想自己写个游戏,有的是因为研究需要,有的存粹是看了几篇“学python提高xx倍效率”的文章产生了兴趣,想拓展一下自己的技能......

挨你胃,总之学习编程对于他们来说是有必要的。

但是怎么开始呢?

作为一个原生机械系的奇行种,编程方面不能算很厉害,只是有幸多写了几个项目,了解的稍微多一点。其实怎么开始我认为要先明确你的目的,如果你只是想作为兴趣,写几个简单的demo玩一玩,或是想做一个自己的巡线小车,那么图形化编程也许就能满足你;如果是做数据分析研究,Matlab基本能够满足你的需要,也许你实验室的学长能给你很大的帮助;但如果你要建站、要写游戏代码、或是你要和我一样做机器人开发,那么恭喜你,看着这个深渊,做好觉悟跳下来吧。

根据个人接触过的方向,给各位准备跳的朋友们一些建议,有些内容颇为主观,也是我希望和大家讨论的,也希望有经验的朋友不吝留言赐教。

编程逻辑

其实不论学什么语言,都逃不开编程的逻辑,就算你只是在图形化界面玩一玩,想要做出东西来还是需要你运用编程逻辑来建立你的代码。好的逻辑除了让电脑正确的知道你想做的事外,也能大幅减少你的开发时间,让你的程序表现更好。

这里简单举个例子:

机器人上有编号1-8八个开关,每个开关对应一个LED灯,要求在拨动对应开关的时候LED灯会被点亮。

那么有的朋友可能就会这么写了:

if 开关1 = 打开:

LED1亮

else if 开关2 = 打开:

LED2亮

else if 开关3 = 打开:

LED3亮

......

else if 开关8 = 打开:

LED8亮

这么写虽然电脑会正确执行,但如果现在有100个开关,或是现在题目要求你把LED改为闪烁,那么你一行行改会写到哭出来。

那么我们把代码加一个循环,让电脑来代替我们执行重复的事情:

for 开关序号 in 所有开关序号:

LED对应序号 = 开关序号

LED对应序号亮

问题解决。通过回圈逻辑的正确运用,不仅省去了大量敲代码的时间,并且在后续的修改的便利性上也比前者要高非常多。

这里再举个例子(题目来自LeetCode):

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

相信很多小白朋友看到这里要准备点击右上角的×退出了,而有的朋友可能也会喷了:Rz你怎么在介绍准备学习的篇章就拿出LeetCode的题目来轰炸小白了?

放松放松,这里只是拿来举个例子,如果你还在准备学习阶段,那么代码部分看一眼就好了。

我简单用python写了两个题解,并提交测试运行时间,其中一段代码是这样的:

[cc  lang=“python”]
for i in range(len(nums)):
print(i)
miners = target - nums[i]
if miners in nums:
index = nums.index(miners)
if index != i:
return [i,index]
[/cc]

执行结果如下:

可以看到执行用时在1000ms;

而另一段代码如下:

[cc  lang=“python”]
dic = {}
for index, num in enumerate(nums):
if dic.get(target - num) is not None:
return [dic[target - num], index]
dic[num] = index
[/cc]

执行结果如下:

执行用时60ms,和之前的结果差了约17倍。

这里可以看到,同样的问题不同的逻辑和写法,运行效能有非常大的提高。这也是好的程序员的价值体现,个人认为在初学阶段就应该注意到这一点。单论程式能力,如果你的代码永远比别人简介高效,那么你的价值永远比别人要高。

而关于编程逻辑的学习,我个人没有什么非常好的方法,我除了大学上的C语言的入门课程和逻辑设计外,大部分主要靠看代码写项目和刷题,所以对我来说就是多写多看多想而已。

万变不离其中:C++

如果你打算深入编程并且你有足够的耐心,推荐可以从C++开始学习。

通过学习C++,你能完善的了解到如编程逻辑、数据类型等概念,这将为你之后学习其他编程语言打下坚实基础。同时,C++更接近底层,方便直接操作内存,并且运行高效,学习理解了C++,那么再学习其他编程语言将会变得很轻松。

而从使用的角度来看,大部分的开发领域或多或少都会用到这门编程语言。比如我在大学期间上的机器视觉课程、嵌入式课程以及写的相关项目,大部分内容都是使用C++开发的。

一个简单的CV例子,Unsharp_Masking

瀚宇文创(www.hanyuman.com)——seo优化,网站建站,各种干货心得分享

人生苦短,我用Python

如果你要快速构建一个项目,或是代码内没有进行密集运算,那么使用python会是一个不错的选择。同样一个问题,使用python构建的代码会比C++要简洁很多,易读性也更高。

举个栗子,如第一点中提到的LeetCode题,用C++写看起来会是这样:

[cc  lang=“c++”]
unordered_map m;
for(int i=0; i < nums.size(); i++) { if(m.find(target - nums[i]) != m.end()) return {m[target - nums[i]] , i}; m[nums[i]] = i; } return {}; [/cc]

对比python代码:

[cc  lang=“python”]
dic = {}
for index, num in enumerate(nums):
if dic.get(target - num) is not None:
return [dic[target - num], index]
dic[num] = index
[/cc]

而相较C++,python在跨平台的表现上要更好一些,比如你想把你的demo代码从装有Windows的PC搬到运行Ubuntu的树莓派上,对于python而言,大部分情况下就是几行安装python与依赖库的命令加一个复制黏贴的操作就完成了。

而python对于库的安装也很友好,我的习惯就是打开命令行,敲一行pip install,然后看着它跑完就可以开始用了。

所以对于刚接触编程并且并不打算以此为主业的朋友,接触并学习python是个不错的选择。而对于决心深入学习的朋友,同时学习C++与python会对你有很大帮助。

我要写网站!

其实我的专业并不是写网站的,但因为一个神奇的课程在两周内学习并建了一个有注册登录留言的网站并上线测试,有幸有机会能对这块发表一些浅显的见解。

网站结构一般而言分成前端和后端,前端一般使用HTML+JavaScript,代码从服务器发送到客户端由浏览器解析,并形成你所看到的页面;后端的语言有很多,诸如php、python、go等,实际上是在处理客户端的请求并回传响应。当然,一般的网站还会使用数据库如MySQL来存储数据。所以如果你想要开始学习写网站,可以考虑从HTML开始学习,然后接触JavaScript,并且选择一个后端进行学习。

我要做游戏!

如果你想要自己写一个游戏,建议你根据你想做的游戏类型来选择接触一个游戏引擎或是开发工具。不过在此之前,如果你完全没有接触过编程,建议先学习基础的编程语言锻炼编程思想,在有一定积累后再开始学习这一块。

如果你打算开发HTML5游戏(如微信小游戏)或是电脑、手机端2D游戏,cocos是一个不错的选择。cocos是一个开源的游戏引擎,近几年受到众多开发者追捧,其支持语言如JavaScript、TypeScript,不难找到学习资料。

如果你打算做体量稍微大一些的游戏,无论2D/3D,Unity是个很不错的选择。其个人版是免费的,支持JavaScript和C#,跨平台,但技术门槛(除去逻辑层外,比如渲染)可能较高,美术方面的成本也比较高一些。我个人凭着兴趣正在做的游戏也是用Unity开发的。而如果你打算做画质更好、体量更巨大的游戏,除了Unity外,也可以尝试UE4。顺便一说,之前有看过一篇论文(Deep Object Pose Estimation for Semantic Robotic Grasping of Household Objects)使用UE4生成数据训练单目摄影机物件姿态估测,效果相当不错,也许之后有机会可以做一个论文回顾。

如果你决定自己写一个游戏引擎......还是躺下比较快,梦里啥都有。可以妥善运作的游戏引擎在没有大量编程语言、硬件驱动、图形处理等领域知识积累的情况下,是无法写出来的。

而制作一个成品的游戏除了程序员外,还需要美术、音乐等方面知识技术的配合,你也许会需要一个团队,并且需要大量的时间精力花在上面。如果你是一个有着制作游戏梦想的朋友,加油努力吧!

深度学习、视觉点云、神经网络跑起来!

如果你想要接触深度学习相关的编程,除去该领域的知识积累,也许比较好的选择是使用Python。TensorFlow、Pytorch、Keras、MXNet等纷纷表示支持,pip install真香,哪怕你只想做一个调参侠,GitHub一拉代码千行。人生苦短,我用python。

如果你的研究有需要机器视觉相关的编程,比如想使用OpenCV,那么C++和Python都是还不错的选择。如果是学习的话使用C++会比较好,开发上Python确实方便很多,但个人使用的感觉是不如C++那么自由。

OpenCV处理深度影像,结合SSD神经网络进行物件定位追踪

至于点云库,如果你要使用PCL,那么除非项目要求,建议还是使用C++,学习资料方便找,官方文档也可查。之前的项目我有使用过Python,写的异常痛苦,资料难找官方示例也少,还碰到过部分库python的版本找不到、接口、编译安装以及安装依赖的各种坑。

量测自RealSense D435的点云,以及去背处理后的咖啡杯

让我们做个机器人吧!

想做一个简单的机器人,如果你没有硬核到去折腾单片机,而且是自学的话,试试Arduino吧!Arduino是一款便捷灵活、方便上手的开源电子原型平台。而其开发软件ArduinoIDE使用C++,但是其很多包好的东西让你感觉写起来如同python般轻松。你可以使用Arduino控制电机与接收传感器资讯,结合你的机构设计能力制作一个简易的机器人(当然,物联网设备什么的也是可以的,有很多支持ArduinoIDE的无线开发板,物美价廉),也可以用Arduino当做一些节点的控制板,通过电脑、树莓派或TX2这样算力更强的控制器来运行一个更大的机器人。总之,Arduino易学易用,深受广大工科学子与技术爱好者们的喜爱。

如果你想要进行机器人开发与研究,更进一步的选择或许是使用ROS。虽然现阶段ROS的特定版本已支持windows,但相信我,使用Linux会是更好的选择。ROS的细节在此按下不表,但做机器人似乎没有什么比ROS更好更强力的开源选择了,总之,用它就完事了。

使用ROS建议你学习并熟练使用Linux系统,会使用C++或是Python(最好两者都会),并从了解ROS的结构开始学习。而这也是一个深坑,除了编程知识外你还需要机器人学、机器视觉等领域相关知识。

本文来自投稿,不代表瀚宇文创立场,版权归原作者所有,欢迎分享本文,转载请保留出处!

RemannZ
RemannZ 关注:0    粉丝:0 最后编辑于:2020-06-11
这个人很懒,什么都没写

发表评论

表情 链接 私密 格式 签到

扫一扫二维码分享