4

当程序猿遇上数学

 3 years ago
source link: https://blog.csdn.net/eclipsexys/article/details/115743922
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
当程序猿遇上数学_eclipse_xu-CSDN博客

    曾经一直有人问数学老师,学数学有什么用?我去买菜难道还要用到微积分吗?我去开会难道还要用到线性代数吗?这估计是很多人学不好数学、不想学数学而找的借口,但这个问题究竟要怎么回答呢?今天我就站在程序员的角度上来回答下这个问题。

    隔壁老王是一个刚入职的程序猿,最近正在被资深程序猿小明带着。

    小明:老王,你数学怎么样啊?

    老王:啊,数学?加减还可以,乘除就要看了。

    小明:¥#…&*)@!

1Mission One

    小明:老王,最近射击师小红设计了一套不错的UI动效,你不还是单身狗吗,给你个机会去聊聊妹吧,把这套动效完成好!

    老王:跪谢小明,保证完成任务!

    小红:动效很简单,就几个动画,几个自定义View,自定义View要能适配各种大小,点击的时候判断区域来显示动态效果。

    老王:包在我身上,so seay,just do IT。

    过了几天……

    小明:时间就是金钱,我的老王,工作完成的怎么样了啊?

    老王:尼玛,这玩意算不清楚了啊,怎么一会要算大小,一会大小算的又不对,还得去学自定义View的绘制原理,这什么鬼!

    小明:卧槽,你不是说你加减法不错的吗??这里都是最简单的加减法啊!!好好了解下自定义View的onMeasure和onLayout的含义和流程,下面就是完全的数学计算了啊!实在不行,公司有一本《Android群英传》,里面的第三章『Android控件架构与自定义View详解』,对自定义View的流程进行了非常详细的讲解,可以好好参考下。

    老王:嗯嗯,太好了,我马上去看!

    的确,很多人抱怨自定义View很难,而实际上,一个基本的自定义View,使用到的,实际上就是最简单的加减法,根据坐标、大小,来计算自己的位置,大小,而很多人觉得复杂,只是被一些高级的自定义View给唬住了,往往看见非常复杂的坐标运算,就放弃了。实际上,只要你『明知山有釜,偏向釜山行』,静下心来仔细分析每个公式的含义,相信很快就能了解它的作用,同时,只要你淡定下来,好好梳理下你要实现的自定义View的显示,根据Android所提供的那些API进行编写,写上几个,就有套路了,毕竟,加减法还是很简单的嘛!

2Mission Two

    小明:感谢天,感谢地,你的自定义View终于写好了,可是动效呢?难道你看片只看截图?赶紧给我动起来!

    老王:哦,我一般都是老司机带着看的。我尝试下自己动动吧。

    a few days later……

    小明:时间就是金钱,我的老王,工作完成的怎么样了啊?

    老王:为了部落,我的女王!

    小明:别BB,今天搞不定,晚上团队保健,哦不,团队活动你别来了。

    老王:可是,这个区域真的很难啊,我数学不好,可是要判断『一个点击点是否在一个闭合路径内』,这个问题很难啊,我在网上找了,这个至少要用到高中数学啊!!

    小明:卧槽,你似不似傻!Android提供的API你都了解吗?通过Region不就可以很方便的判断了吗??还算法,算你妹啊!

    老王:嗯嗯,太好了,我马上去看!

    的确,很多人抱怨自定义View里面要做很多很复杂的判断,一会牵扯到这个算法,一会牵扯到那个算法,但实际上,这些都是你对Android API不了解所造成的,很多常用的算法的判断,都被Android所封装了起来,你只需要简单的调用即可,否则,你就会花费大量的时间,来做一些无谓的工作。另外,掌握好Android的一些API,可以给你提供更简单的绘制方法,例如对Canvas的旋转、锁定、图层等API的使用,有时候就可以让复杂的角度计算,变成加减法的运算。

3Mission Three

    小明:老王,小红跟我反映,你上次的动效很僵硬啊,完全不像是一个高级工程师写出来的东西啊

    老王:卧槽,我本来就不是啊。

    小明:你都工作好几天了,是时候向高级程序猿进军了!来,把这个动效改的更自然一点吧!

    老王:哦,是不是写完就是高级程序猿了。

    数日後……

    小明:时间就是金钱,我的老王,工作完成的怎么样了啊?

    老王:我看了,要模拟更加真实的动画,就需要用到TimeInterpolator和TypeEvaluator,还有各种函数的计算,这明显要用乘除法了啊!

    小明:卧槽,你高中数学老师在哪,看我打不死他!几个函数图像都不能理解,你还想进阶高级程序猿!好好看看微信公众号『Android群英传』的这篇文章吧模拟自然动画的精髓——TimeInterpolator与TypeEvaluator,要想多学干货,一定要多看这个公众号!

    的确,程序开发中的很多细节,都需要使用数学来进行精益求精。文中的这个例子,就是一个比较典型的代表,函数图像在开发中有很多用处,但这并不代表我们需要去推导、去研究新的函数,至少老王的高中数学还达不到这水平,我们只需要去了解、知道如何使用、计算就OK了。让专业的人去做专业的事,我们是程序开发、而不是数学家。

4Mission Four

    小明:老王,你已经是高级程序猿了,是时候给你一些高难度的任务了。

    老王:我才工作几天啊!

    小明:嗯,不错,这次的图像处理任务就交给你了哈,顽张ってください!

    逝者如斯夫……

    小明:时间就是金钱,我的老王,工作完成的怎么样了啊?

    老王:图像的处理要使用到矩阵这些知识,我现在正在复习线性代数!

    小明:卧槽,复习你妹啊!图像处理也好、Matrix变换也好,用到的线性代数最多不超过线代的第一册、第二章、第三节!了解最基本的矩阵知识就可以了啊,实在不行,去看看公司那本『Android群英传』的第六章和第七章吧!

    老王:嗯嗯,我马上去看!

    的确,矩阵在Android中用的非常多,很多程序都是通过矩阵来进行运算的,这也是线性代数的实际意义所在,很多人刚开始学习线代的时候,认为好像压根都没有一点用,但实际上,这些都是现代计算机的基础知识,掌握好这些知识,可以让你在后面开发程序的时候,对这些处理有更加深刻的认识,因为虽然SDK给我们封装了很多矩阵的操作方法,但是,知其然,and其所以然,会让你对知识点有更加深刻的理解,同时,遇到问题,也有更多的思路去分析。

5Mission Complete

    老王:小明,你简直比数学老师还牛逼啊,短短几天,我的数学突飞猛进啊,我感觉现在已经直逼高等数学了啊!

    小明:你知道我为什么要用自定义View来给你讲解数学吗?自定义View对于初学者来说,是学习Android常常遇到的第一只大老虎,而且也是最能看出一个程序猿数学基础的知识点,一个自定义View,说白了,就是让你教计算机这个『智障』如何去画画,计算机什么都不懂,他只能按照你的思维去绘制,而你需要做的,就是将View拆解成坐标点、已经点运动的轨迹,那么这里所用到的知识,包括但不限于以下几种:

  • 角度与弧度

  • 贝塞尔曲线

    掌握这些基础知识,不仅仅是学好自定义View,更是学好编程的基础,当然,这里面的大部分知识,在高中数学就已经基本学完了,大学里的高数,不过是进一步的补充和优化,如果你是一般的应用程序开发,那么这些就够了,但如果你是一些比较专业的应用开发,例如图像、音频处理这些App,就需要比较专业的数学知识了。

    所以说,程序猿需要数学吗?如果你只想重复写写那些页面,调整调整UI的话,那确实不需要,但一个不想当医生的厨师不是一个好程序猿,如果你要让你开发技能更上一层楼,那你就必须对数学有所了解,不管是最简单的取模、排序,还是一些常用的算法、图像处理、图形变换,或者说,是一些动效、UI,这些都需要数学知识来支撑。

    另外,我想说的是,即使对于非程序猿,哪怕是文科生,数学依然是非常有用的一门学科,但它对于这些人的帮助,并不是在于方程、函数,而是数学思维的培养,数学思维,让一个人的思维更缜密、逻辑有条理,这才是数学对人最大的帮助!

    老王:小明说得对!小明真牛逼!

以上内容纯属虚构,如有推广,是我故意的!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK