发新帖本帖赏金 5.00元(功能说明)我要提问
123下一页
返回列表
打印
[C语言]

我多年锤炼的小伙伴入职C语言培训案例,长篇连载中

[复制链接]
5505|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小马儿|  楼主 | 2016-8-13 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
你的C语言能力达到职场基本要求了吗?用三个例子来夯实(1)

不记得从何时开始,自己就经常承担企业招聘的工作,侧重于工业嵌入式产品研发人员的招聘。

出于对企业和新人的负责态度,我倾向于寻觅那种基础知识扎实,且对嵌入式编程有兴趣的人员,这样对企业发展、对个人成长都有好处,可惜很多次都如同大海捞针,希望而来失望而归。

这是我很纠结的一个问题,不由得想起了曾经听过的一个故事:一个外国人来国内某公司考察,首先看到了职员的工作态度,狂吐槽,这样的员工企业应该全部裁掉;然后中午吃饭的时候,品尝了企业的午餐,又开始骂企业了。

回头看一看目前的大学教育模式,很多学校还是沿袭类似于初高中的填鸭式教育方式,大多数学生也是在吃喝玩乐混日子,即使大一新生还有些激情,很快就被大环境给污掉了。然后就是学生、学校和企业的互骂,搞得一片狼藉,戾气冲天。

一个要好的朋友在国内某985大学教计算机,一次和他聊天埋怨到,现在的学生入职后好长时间都没法上手,培训周期很长,然而朋友的观点是,这应该是理所当然的啊,大学能学点啥,都需要到企业才能锻炼的。无语……

真应该是这样吗?我很茫然,但看到每个学生背后为学费辛勤劳作的父母,看到他们对子女期望的眼神,我认为,我们可以做的更好,也应该做的更好。

为了让大家体会我内心纠结的心情,先简单的聊一聊招聘试题的事情。

以前我参加过中兴的招聘,招聘老师给我出了一道题目,int n = 3,4;我说我不知道,这是变态的用法,我们不应该这样用,您也不应该出这样的题目。可能当时年轻气盛,将招聘老师气了个半死,我当然也无缘中兴了。
吸取以前的教训,后来我在组织招聘时,有一个基本原则,只有在工作中经常会用到的知识,才会作为考察的范围。

为了挖掘一些好的苗子,我们也一直在思考怎样的试题可以更好的考察出求职者的能力和兴趣。最开始的方式是先问一些基础课和专业基础课的基本概念,滤除基础知识不扎实的人;然后期望求职者能讲解一个自己曾经凭兴趣写过的程序,然后借着求职者的描述,然后不断的深入,以判断他的能力具体到了什么程度。

可惜,99%的人根本说不出自己凭兴趣写的程序,碰上几个胡诌的人,几句话就露馅了。后来只好雪藏该问题,然后降低难度,出一些单层循环,且每层循环适度判断的编程例子(如判断一个整数中0的个数等)。如果每次招聘,能碰上一两个将这类程序快速写出来的同学,大家都可以兴奋半天了。

这就是我们能招聘到的学生的普遍能力了,在我看来,要达到这个能力,只要随意的学习几天编程就可以了,还需要大学四年干嘛,让人郁闷啊。

但一个更加现实的问题是,这样的人招聘进来企业如何使用。我们不敢直接拿着产品让菜鸟人员练手,大家都知道,产品是要卖给用户的,初期的小问题到了用户那儿就会放大成大问题的。

企业培养不同于学校教育,不会有人给你填鸭式,更别指望有人手把手的教你,很多时候都是散养,顶多指点几句然后自己看书去。这种情况也导致了很多人初期很难上手,一些人甚至被迫转行,荒废了自己多年的专业方向。

如何快速过渡,结合自己多年的工作和新人培养经验,我总结了一套比较有效的方式,将产品研发需要的初级C语言知识巧妙的融入到三个例子中,让新人通过这三个例子去学习,去碰壁,去思考,持续的提高自己的C语言能力,尽快具备可参与产品研发的能力。

从本篇**开始,我计划用十几篇**来系列描述我的新人入职培训方法,大家会慢慢的发现我们的培训模式不同于常规模式,也希望这个系列**能作为自己构建IP的第一个爆点。喜欢并期望提高自己C语言能力的人,可以关注我。

打赏榜单

dirtwillfly 打赏了 5.00 元 2016-08-13
理由:精彩分享

相关帖子

沙发
小马儿|  楼主 | 2016-8-13 15:32 | 只看该作者
你的C语言能力达到职场基本要求了吗?用三个例子来夯实(2)

很多刚入职的新人,都喜欢问一个类似的问题:“如何学习……?”,然后一些朋友就会给拷贝一大堆书籍资料,更热心的还会指导先看哪本在看哪本。

但不幸的事,很多时候就截至于此了,一大堆资料依然静静的躺在电脑硬盘里,只是在偶然的情况下才会打开翻看两眼目录。

走过一些企业,培训体系一般是这样的:
1.新人入职后,师傅会给一堆资料让看,然后新人硬着头皮看一些;
2.哪天师傅不忙了,惦记起这个新人,然后交给其一个产品,让其折腾;
3.可惜具体产品一般都涉及多个学科,面对一大堆疑问,新人会感觉腾云驾雾般难以前行;
4.一段时间后部分人迈过了入职时的绝望悬崖,有了自己的积累,开始慢慢的深入接触产品,但因各种文档资料奇缺,只能一边学习一边调整;
5.数年后,新人成为了老手,同时新的产品体系也诞生了;
6.然后重复以上死循环。

长此以往,公司的产品体系变得非常的杂乱,技术难以复用,无法进行有效的积累,那种如臂使指的团队构建更是空谈。

如何才能跳出上述死循环呢?我在自己的职业生涯中进行了大量的探索尝试,有了一点感悟:不仅需要将新人的培训工作尽可能前移,尽可能体系化,而且要尽早的融入我们的设计及团队理念。因此在后续的三个C语言例子中大家会体会到很多东西不仅仅是C语法层次的内容。

前面我谈到,在公司,不可能在重复学校的填鸭式的教育模式,也不会有人手把手的教你。那么在这种情况下,如何组织培训工作,很多时候反而成了一件颇具艺术感的选择难题。

随着移动互联网的盛行,在线教育也流行了起来,网络上出现了大量的视频教程。紧随时代的脉络,我尝试过将入职需要学习的内容做成书籍和视频,但效果一般。后来细细研究这个领域,发现大多数视频仅仅是将大学课堂的内容移到了网络上,很多人也仅仅是耐着性子看个几集,然后就不了了之了,因此导致的效果不佳。关于在线教育我也有一些自己的想法和思考,后面会专门撰文描述,这儿就不深入介绍了,总之,初期的尝试是不太成功的。

我想彻底改变这种填鸭式的培训模式,直接给新人答案并不是最好的方案,如何能让新人自己寻找答案,去记录并沉淀自己的成长之路,才是更好的方式。而且在实施的过程中同企业的流程化管理结合起来,不仅导师培训精力消耗的比较少,而且新人成长的效果也比较好。

很多的坑总是要去摔一次,才会**深刻,才能学到精髓。而第一个例子中就满是坑,喜欢的可以关注我,请耐心等待下一篇**。

使用特权

评论回复
板凳
小马儿|  楼主 | 2016-8-13 15:39 | 只看该作者
入职C语言例子一(1)

说是用三个例子来夯实C语言基础,可是都已经两篇**了,一个例子还没看到,一些朋友留言有点怒了,呵呵,马上奉上第一个例子:“编写一个控制台程序,已知内层和外层菱形的高度,输出一个空心菱形”。

是否看上去很简单啊,写到这儿,很是期望正在阅读的你能先停下来,思考思考,然后付诸行动,编写几行代码小试一番,然后在继续读下去,收获会更大。

这些年,我带过很多人,大部分人看到这个题目后,然后立即就开始写程序去了,自己内心多少有点小小的失望,为何?

一般通过公司层层把关招聘进来的软件人员,这个例子总是可以弄出来的,不过可惜的是,近一半以上的人不能准确的实现出来,仅一个菱形高度的理解,就是五花八门,乱七八糟的,执行如这样的:

或者这样的:


或者干脆是这样的:


为何会出现这种情况,这恰恰是该例子的第一个大坑:需求不明确。一开始就碰到挫折,对很多新人来说,这无异于当头一棒,不过**也最为深刻。

一个团队协作时,会存在大量的交流,而交流过程中,总是会产生或多或少的歧义,而恰恰是这些歧义会导致需求的不明确,会导致大量的返工,甚至会导致项目的失败。我给新人的第一份建议:将需求用自己的语言表达出来,和对方确认后再实施。这一点在以后的团队协作中非常的重要,因此我早早的将这一点嵌入到了入职培训中。

经过这么一折腾,第一个例子重新描述如下:“写一个控制台程序,用户输入内层和外层菱形的高度,输出一个空心菱形,菱形的高度定义为菱形的上三角形的高度,如输入5和3,输出如下:”
    *
   ***
  ** **
**   **
**     **
**   **
  ** **
   ***
    *

这儿稍微补充两点:
1. 菱形高度定义好似有违常理,但在编程的世界中,简洁就是常理,如果定义为整个菱形高度,那么不仅需要进行正整数判断,而且还需要奇数判断,增加了程序的复杂度。
2. 用一个例子描述,比一大堆文字管用多了,是所谓一图顶千言。



明确知道要做什么了,然后很多人又回去,然而很多情况下执行结果如下所示:


这儿引出了第二个很重要的概念:边界判断。给出两个数,如何简洁且完备的判断其是合理的输入,这是编程的基本功,这些内容在大学教学过程中一般不太重视,但想做出合格的嵌入式产品,这一点必须引起足够的重视。如何做出优雅的边界判断,这个例子比较简单,留给正在阅读的你吧,顺便回头想一想我前面菱形高度的定义吧。

第二次被打道回府后,很多人会有急躁情绪,菱形还没输出呢,就给灌输了一堆规则。碰到这种情况,我会给他们讲解嵌入式程序的特点(这一点留待后文慢慢描述),以及我以前的经历。我刚开始工作时,因CPU速度受限,程序还主要是汇编语言,领导让写一小段汇编程序,但每次提交后,都被劈头盖脸的骂一通,让回去整改,直到后来一行汇编语句都省不下去了,才算通过了。回头看,为了一个小小的例子,竟然将大多数汇编指令熟悉了,方才明白领导的良苦用心。现在的新人脸皮薄了一些,不敢乱骂了,只好慢慢讲道理了。



经过第二次的折腾,大部分新人态度都能稍微端正起来,而且这次写出来的例子,和需求基本吻合了,但当兴致冲冲的跑过来交差时,我反而不看程序,开始问起在实现这个程序过程中用到的调试技巧。

这个例子对新人来说有一点点的难度,不可能一次就写好的,肯定会经历一些痛苦的调试过程。但是在国内的大学教育体系下,却又不太重视基本调试技能的锻炼,期望新人一开始意识到调试是一项基本功夫,需要引起足够的重视,需要去持续的加强。



雄关漫道真如铁,而今迈步从头越,一个小小的例子还未起步,对很多人已是一场痛苦的经历。要想成为一个合格的嵌入式工程师,需要方法,需要才智,更需要背后的汗水和**,本系列**会带领大家体味我的成长路,但无法代替你自己的付出和汗水。我是小马儿,一个渴望良知与灵魂的工程师,愈想踏上这条不归路,请关注我。

使用特权

评论回复
地板
小马儿|  楼主 | 2016-8-13 15:40 | 只看该作者
图片发布上去, 大家到我的图集中去看吧, 至于是哪一个, 只好自己意淫了, 总之不舒服的三个菱形就是了, 呵呵.

使用特权

评论回复
5
小马儿|  楼主 | 2016-8-13 15:41 | 只看该作者
入职C语言例子一(2)

在上面**提到如有心可以尝试着写一写空心菱形程序,然后发送给我,本不报太大希望的,没想到竟然收到了几篇,颇感意外。

但有一点让我感觉意外,该篇**在额外补充一下。在第(1)节中,我提到由该例子引出了三个重要概念,其中第二个概念是:边界判断。给出两个数,如何完备且简洁的判断其是合理的输入,这是编程的基本功。很可惜的是,这几个例子都没有做到。结合自己多年带人的经验,这儿补充阐述一下。

输入两个数,一个是外菱形的高度(m表示),一个是内菱形的高度(n表示),有如下几个判据:
1. 两个高度都应该是正整数(内菱形高度可以为0);
2. 受限于屏幕的大小,菱形高度应该受限;
3. 外菱形高度应该大于内菱形的高度。

以前带人的时候,拿到例程后,我喜欢先输入(1000,800)这样的值,因为这是容易被忽略的地方,很多人郁闷的铩羽而归。

大部分人都是缺判据,也有一些人性格比较谨慎,习惯写一大堆的判断条件,如下面这种的:
if (m > 0 && n > 0 && m > n && m < 30 && n < 30) {
   ……
}

总之,都没有抓住判断条件应该完备且简洁的基本准则,实际上该例子很简单,只要简单的分析,判断条件也就三个,如下:
1.内菱形高度大于等于0;
2.外菱形高度小于约定之(假设30);
3.外菱形高度大于内菱形高度;
写成程序示意如下:
if (n >= 0 && m > n && m < 30) {
   ……
}

还记得第(1)节中我们约定菱形的高度是上三角形高度吗,带来的好处就是判断的简洁化,概念是为目标而服务的,不然该处的判断还需要额外的增加两条奇数判据了,简洁性也会打折扣了,呵呵,可以再回味一番。

在嵌入式产品中,最终产品的鲁棒性,很多时候就是表现在这样一点一滴的简单判据上,该处的不厌其烦,也是期望新人慢慢的融入研发团队时,能够充分意识到这一点。

------◆------

终于要开始输出空心菱形了,但对于刚毕业的大学生,这个例子刚上手还是有一些绕的,其思维逻辑是如何的呢。

一般人都会发现,输出空心菱形要稍微复杂一些,那么我们修改为输出菱形呢,是否简单很多,如果还嫌复杂,修改为输出三角形呢。呵呵,说白了,就是将复杂的问题去其枝叶,先简后繁的慢慢处理。

一开始的问题就简单多了,已知三角形高度m,输出三角形,如m=5,输出如下:
    *
   ***
  *****
*******
*********

为了直观,将空格也表示出来,示例如下:
----*
---***
--*****
-*******
*********

此时,结论已经很形象了,每行输出的空格从m-1递减,每行输出的*从1开始递增,循环子为m,程序示例如下:
for (i = 1; i <= m; i++)
{
  j = m - i;
  while (j--)
    printf(" ");
  j = i * 2 - 1;
  while (j--)
    printf("*");
  printf("\n");
}

问题复杂化,考虑空心三角形,相当于里面又多了一个三角形,我们输出的时候,将其简单扣去即可,假设n=3,如下图示例:
----*
---***
--**-**
-**---**
**-----**

程序示例如下:
for (i = 1; i <= m; i++)
{
  j = m - i;
  while (j--)
    printf(" ");
  j = i * 2 - 1;
  for (k = 0; k < j; k++)
  {
    if (k < m-n || k >= j-m+n)
      printf("*");
    else
      printf(" ");
   }
   printf("\n");
}

进一步复杂化,输出完整的空心菱形,仅仅需要将上面的程序重复一下,仅仅是将其颠倒一下,且高度调整一下(减1处理,表达式更加复杂了)而已,我就不展示示例程序了,大家有兴趣的可以自己尝试一下。

------◆------

有些人在实现该程序的时候,一开始就是对空心菱形进行分析,最直观的分析策略就是将菱形分层了三段,上三角形,下三角形,中间的空心部分,如下图示意:
    *
   ***
  ** **
**   **
**     **
**   **
  ** **
   ***
    *

按照这种思路,程序示意如下:
for(i=1;i<2*m;i++)
{
    if(i<=m-n) {
        star = 2*i-1;
        empty= m-i;
        while(empty--)
            printf(" ");
        while(star--)
            printf("*");
    }
    else if(m-n<i &&  i< m+n && j< 2*n) {
        if(j <= n && i <= m){
            num_empty = 2*j-1;
            empty = m -i;
        }
        else{
            num_empty = 2*(2*n-1-(j-1))-1;
            empty = i-m;
        }
        num_star = star = m-n;

        while(empty--)
            printf(" ");
        while(star--)
            printf("*");
        while(num_empty--)
            printf(" ");
        while(num_star--)
            printf("*");
        j++;
    } else {
        star = 2*(2*m-1-(i-1))-1;
        empty = (2*m-1-star)/2;
        while(empty--)
            printf(" ");
        while(star--)
            printf("*");
    }
    printf("\n");
}

不管如何,至此,这个例程就算完成了,但大家有没有发现上面这些程序都谈不上优雅啊,其中各种m和n的表达式,一段时间以后看,基本同乱麻差不多了,试想,如果这是产品的程序,让后来人如何阅读并维护。

因通过微信阅读,都是在碎片化时间进行的,因此在构建这个微信公众号的时候,就期望每篇**字数控制在1000以内,这样可在5分钟之内读完,可惜从开始到现在,几乎所有的**都超了,惭愧。

该篇**就此打住,下一节我会给大家分享一个比较巧妙的实现方法,至少不会出现太复杂的m和n表达式了,喜欢的人请继续关注我的公众号。

我是小马儿,一个渴望良知与灵魂的工程师,欢迎您的陪伴与同行。

使用特权

评论回复
6
小马儿|  楼主 | 2016-8-13 16:01 | 只看该作者
今天就弄到这儿了, 不然担心大家会有阅读恐惧症, 哈哈.

使用特权

评论回复
7
dabing89| | 2016-8-13 19:09 | 只看该作者
小马儿 发表于 2016-8-13 15:32
你的C语言能力达到职场基本要求了吗?用三个例子来夯实(2)

很多刚入职的新人,都喜欢问一个类似的问题: ...

很多的坑总是要去摔一次,才会**深刻,才能学到精髓。顶大侠

使用特权

评论回复
8
dabing89| | 2016-8-13 19:13 | 只看该作者
小马儿 发表于 2016-8-13 15:39
入职C语言例子一(1)

说是用三个例子来夯实C语言基础,可是都已经两篇**了,一个例子还没看到,一些朋 ...

一个渴望良知与灵魂的工程师,赞

使用特权

评论回复
9
justtest111| | 2016-8-14 14:27 | 只看该作者
int n = 3,4;
这个不是错误的声明吗?

使用特权

评论回复
10
90houyidai| | 2016-8-14 16:43 | 只看该作者
网上的视频只会教基础的知识,剩下的不管是做产品还做项目都是要让你交钱学的,但是往往都是想楼主说的,很多时候国内的培训体系都是
1.新人入职后,师傅会给一堆资料让看,然后新人硬着头皮看一些;
2.哪天师傅不忙了,惦记起这个新人,然后交给其一个产品,让其折腾;
3.可惜具体产品一般都涉及多个学科,面对一大堆疑问,新人会感觉腾云驾雾般难以前行;
4.一段时间后部分人迈过了入职时的绝望悬崖,有了自己的积累,开始慢慢的深入接触产品,但因各种文档资料奇缺,只能一边学习一边调整;
5.数年后,新人成为了老手,同时新的产品体系也诞生了;
6.然后重复以上死循环。

甚至还没有师傅指点,一个人慢慢趟坑

使用特权

评论回复
11
小马儿|  楼主 | 2016-8-14 21:13 | 只看该作者
dabing89 发表于 2016-8-13 19:13
一个渴望良知与灵魂的工程师,赞

这是我的微信公众号签名, 为何是这样的签名, 我有两片**描述的,呵呵。

使用特权

评论回复
12
小马儿|  楼主 | 2016-8-14 21:16 | 只看该作者
justtest111 发表于 2016-8-14 14:27
int n = 3,4;
这个不是错误的声明吗?

嗯, 你是个细心的人, 当时想考察我,表达式的
int n;
n=3,4;
我写**时,给整一起了,好像这样定义的话,成常量表达式了,可能不合法。
不过赋值表达式中,逗号操作符是合法的。

使用特权

评论回复
13
小马儿|  楼主 | 2016-8-14 21:18 | 只看该作者
入职C语言例子一(3)

-------------------------------------------------------

优美,总是让人心醉,一提到优美,最容易想到的是悦目的图画,动听的乐章、精妙的诗文……。然而,数学,自然科学的皇后,却蕴含着比诗画更多的优美。

优雅的程序,或许其背后都蕴藏着数学的优美。

在第(2)节中描述的一些例子中,我们总是在努力的拼凑各种m和n的表达式,与其这样苦苦寻找,为何不直接将这个空心菱形放入坐标轴中呢。

在电脑屏幕上,人们习惯将靠右称之为x轴,靠下称之为y轴,将空心菱形画在屏幕上,示意如下:

然后通过解析几何知识勾勒空心菱形,程序示意如下:
for (x = 0; x < m * 2 - 1; x++)
{
    for (y = 0; y < m * 2 - 1; y++)
    {
        if (abs(m - 1 - y) <= m - 1 - abs(m - 1 - x) &&
            abs(m - 1 - y) > n - 1 - abs(m - 1 - x))
            printf("*");
        else
            printf(" ");
    }
    printf("\n");
}
(注:这个实现版本来自于粉丝群中,就在大家之间)。

我们将所有的判断都集中在了一起,阅读程序,很容易明白这个大大的判断语句是干嘛的了,是否比以前的实现都优雅了很多呢。



不过这个判据好像还是挺复杂的,有没有更好的办法呢,估计很多朋友在看到我上面的那幅图时已经想到了,那就是将坐标轴移到菱形的中间去,示意如下:


外菱形的四条边我们用表达式描述出来,如下:
(+x) + (+y) < m
(-x) + (+y) < m
(+x) + (-y) < m
(-x) + (-y) < m

合并后的表达式为:abs(x)+abs(y)<m,此时的程序示意如下:
for (x = -m; x <= m; x++)
{
    for (y = -m; y <= m; y++)
    {
        t = abs(x) + abs(y);
        if (t >= n && t <= m)
            printf("*");
        else
            printf(" ");
    }
    printf("\n");
}

不知大家看到这段代码是怎样的感觉,我仅记得当初自己发现这个实现后,第一次被这种简单的数学美给震撼了。如果大家也有相同的感觉,我坚信,你可以在编程的这条荆棘路上走很高很远…

本来,笔锋一转,立即就会将这段代码抨击的体无完肤了,但内心深处好像有了一点不忍,就让那种优雅的感觉在大家心中在飞一会儿吧。

下一节,我们才会慢慢的步入该例子的正解,会向大家展现适用于嵌入式系统的解法,或许,大家才能慢慢的意识到嵌入式编程和传统编程之间的差别。

今天的额外之喜,微信官方给我发来了打赏功能邀请,前后才短短的一个月时间,这种意外的被认可,让人感觉好高兴。

我是小马儿,一个渴望良知与灵魂的工程师,欢迎您的陪伴与同行。

使用特权

评论回复
14
小马儿|  楼主 | 2016-8-14 21:18 | 只看该作者
这篇**中缺少两个图片, 大家可以到我的图库中找, 两个菱形加坐标的就是。

使用特权

评论回复
15
冰零分子| | 2016-8-14 21:24 | 只看该作者
谢谢分享

使用特权

评论回复
16
犹豫的大三| | 2016-8-14 23:01 | 只看该作者
int n;
n = 3,4;
“,”是合法的,那n的值是多少?

使用特权

评论回复
17
小马儿|  楼主 | 2016-8-16 08:12 | 只看该作者
犹豫的大三 发表于 2016-8-14 23:01
int n;
n = 3,4;
“,”是合法的,那n的值是多少?

呵呵, 自己写个程序就知道了.

使用特权

评论回复
18
小马儿|  楼主 | 2016-8-16 08:16 | 只看该作者
入职C语言例子一(4)
-------------------------------------------------------------
上一节描述了几种空心菱形的实现方法,有的愚笨,有的精巧,今天,让我们在细细审视一下这些实现。

在大学阶段,我学的是计算机专业,对编程的爱好聚焦在各种巧妙的算法和实现上。工作后,开始从事嵌入式产品开发,碰了N多的壁,吃了N多的苦,才明白了嵌入式C语言和桌面C语言是有差别的。

为了让新人尽快迈入嵌入式门槛,因此,今天,注定是一场批斗大会,经历波折,方能成长。

我们首先拿最优秀的实现开刀,在上一节最后,分享了一个很优美的实现,示例如下:
for (x = -m; x <= m; x++)
{
    for (y = -m; y <= m; y++)
    {
        if (abs(x) + abs(y) >= n && abs(x) + abs(y) <= m)
            printf("*");
        else
            printf(" ");
    }
    printf("\n");
}

该实现将最复杂的条件判断置于两层循环之中,因此程序效率很低,而在嵌入式编程中,尤其是一些强实时模块,性能经常是紧绷着的弦。

工业嵌入式产品研发,追求团队作战,追求产品可维护性,追求性能和资源的均衡。可读性、可维护性、cpu计算能力、内存、可靠性等等东东都成为了资源,需要我们的庖丁解牛,经常,我们喜欢将工业嵌入式产品编程戏称为针尖上的舞蹈。

除了这一点,前面的程序还有很多的不足,举例如下:
1. 整个程序经常混杂一谈,增加了他人阅读程序的复杂性;
2. m,n类似的名字,典型的学校风格;
3. 各种复杂的m和n的表达式,一段时候后,估计自己看起来都头大了;
……

因此,我们需要继续上路,为了后续程序实现的方便,将整个程序结构约定如下:
int main()
{
    /* 输入内外菱形高度,并进行合法判断 */

    /* 循环输出菱形 */
    for (……)
    {
        /* 输出前导空格 */

        /* 输出左边星号 */

        /* 输出中间空格 */

        /* 输出右边星号 */

        /* 输出换行 */
        printf("\n");
    }
    return 0;
}

看到这个程序框架,容易明白一点,我们要求以单层循环的方式输出菱形。

细细观察空心菱形的结构,每一行从左到右可以抽象为前导空格,左边星号,中间空格和右边星号四部分,只需要找出这四个值和行号的函数关系,整个程序也就迎刃而解了,如下图示意(各部分用不同的颜色表示):
----*
---***
--**-**
-**---**
**-----**
-**---**
--**-**
---***
----*

我的职业导师经常会和我探讨计算机编程思维的概念,时至今日,我们也没有办法给其下一个准确的定义,但在反复的迭代锻炼中,慢慢的体会到了哪些实现可以称之为计算机编程思维。

举一个例子,在计算机世界中,我们经常仅鼠标、键盘、磁盘、磁盘上的数据等等都称之为文件,可以进行简单的遍历。为何风牛马不相及的东西,我们非要将其抽象成统一的概念呢,这非一句话能描述清楚,后续会带着大家慢慢体悟,但这种设计思想在产品研发过程中,却比比皆是。

插入这两段废话后,回头再来看我们的菱形输出例子,明明每一行的结构不尽相同(回忆一下第二个实现版本,就是分类型分别输出的),但我们非要求同存异,或许,我期望从一开始,就在新人的心中播下架构设计的种子,期待着后续的萌芽。

虽然这儿的话题是以新人培训切入的,但未尝不是自己的成长之路,所不同的是我是在一次次的跌打滚爬中成长起来的。将自己曾经摔过的跟头融入到入职C语言训练的例子中,甚至将自己的整个成长史写出来(该公众号的目标之一,呵呵),但愿别人能以我为镜,成长的更踏实更快速一些。

如果有人感兴趣,可以尝试着将上面的程序框架填填空,或者直接留言,或者发送到我的个人邮箱zhangmalong@126.com

我是小马儿,一个渴望良知与灵魂的工程师,欢迎您的陪伴与同行。

使用特权

评论回复
19
candysnape| | 2016-8-16 08:18 | 只看该作者
好**,楼主是个负责任的好领导

使用特权

评论回复
20
小马儿|  楼主 | 2016-8-16 08:25 | 只看该作者
我计划用**将自己这16年的嵌入式成长路写出来, 里面有数不清的彷徨, 苦闷, 也有惊喜于兴奋.
计划整个**是以第一人称写的, 但现在这个系列是我总结出来用于锻炼新入职人员的, 太基础的东西了, 实在没法以第一人称写了.
不知大家看到类似这样的**, 有什么样的想法, 欢迎留言.

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

42

帖子

14

粉丝