从《编程之美》说开去

一、概述

这段时间,工作之余,断断续续的将《编程之美》这本书看完了,《编程之美》是微软研究院的人员编写的,分四个部分,主要是微软面试中的一些总结和生活工作中的一些趣味问题。对于软件研发人员来说,还是值得一看的,特别是正在准备面试的。

这本书中每个问题的组织还是很科学的,先抛出问题,然后提供多种解决方法,并逐步给出最佳的解决方案,问题解决后还提出一些扩展问题,供人深入思考。对于其中的问题,在第一次接触的情况下,能够顺利的找到最优解决方案是相当不容易的。这需要扎实的基础和丰富的实践,看来想进入微软工作,还是要具有相当深厚的技术功底的。

从书中的问题以及解决来看,主要考察的是数据结构,算法和数学逻辑思维方面的知识和能力。

1.、其中数据结构和算法知识属于基础部分,基础没掌握,基本无法解决问题。而算法的应用和逻辑思维则是属于实践部分,需要平时多思考,做大量的练习才能掌握,如动态规划算法,从原理上来说就是找到状态转移方程,通过递归来解决问题。但是当遇到一个具体的问题时,能否想到使用动态规划来解决,如果使用动态规划,如何找到状态转移方程,如何进行优化,这些问题如果没有大量的实践过程是基本上无法完成的。

2、数据结构方面,考察的主要是链表,队列,堆栈和二叉树方面的应用,如从无头单链表中删除节点,队列中取最大值操作问题以及求二叉树中节点的最大距离等。

3、算法方面,考察的主要是动态规划和分治法的应用,这里将其基本概念以及递归和递推的差别简单描述一下。

动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。
分治法是基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

递归:是计算机中的概念,将问题规模为n的问题,降解成若干个规模为n-1的问题,依次降解,直到问题规模可求,求出低阶规模的解,代入高阶问题中,直至求出规模为n的问题的解。 
递推:是数学上的概念,构造低阶的规模(如规模为i,一般i=0)的问题,并求出解,推导出问题规模为i+1的问题以及解,依次推到规模为n的问题。

对于Fibonacci数列,第一个程序使用递归实现,第二个使用递推实现:

int Fib(int n)
{
    if(n<=2)return 1;
    return Fib(n-1)+Fib(n-2);
}
 
 
 
 
int Fib(int n)
{
    int f1=1,f2=1;
    int i;
    if(n<=2)return 1;
    for(i=3;i<=n;i++){
        int f=f1+f2;
        f1=f2;f2=f;
    }
    return f;
}

4、数学逻辑思维方面,考察的主要是思维的灵活度,如判断一个点是否在三角形之内,蚂蚁爬杆等问题。

同时,从书中来看,微软对于编程风格,异常处理要求也是很严的,一段代码如果风格不统一,异常分支不处理,也就谈不上编程之美了。

编程之美还体现在精益求精,寻找最优的精神上,对于一个问题,如何找到最优解是其非常重要的一个指标。


二、差距

以书中来看,微软为例,其追求的是编程之美,已经将编程上升为一种艺术了。而怎样的代码才能称之为美,就包括统一的编程规范,最优化的算法等。

而国内很多软件开发公司,都只追求功能,其他则思之甚少,以致软件可读性差,可维护性差,灵活性不够。当软件增大到一定规模后,则不得不重新开发或者对以前的设计做重大的修改。这形成了一种很不好的风气,也是一种恶性循环,软件质量不高,导致利润不高,利润不高,则招不到高水平的人才,从而导致软件质量提不上去。这也是很多国内开发者在一定年龄阶段不得不转型的一部分原因,因为没有氛围,时间长了技术也不会有太多提升。

从这也能看出一点国内外软件开发的差距,而如何缩短这个差距,就如这本书给我们的提示一样,追求编程之美。


三、工作中的启发

在平常工作中,几乎很少会遇到书中提出的问题,但其追求编程之美,精益求精的精神是值得我们学习的。

那么,在工作中,对于软件开发人员,值得借鉴的是:使用统一的编程规范,对异常进行处理,精益求精,寻找最优方案。同时在时空复杂度上要做到最优,特别是在嵌入式开发中。

而对于技术型的管理者而言,则需要对整体架构和重要算法负责,对全员能力提升负责,其中主要是对数据结构和算法方面多做一些锻炼。


四、总结

多学习,多思考,学习先进经验,塑造学习型组织。



你可能感兴趣的:(数据结构,编程,算法,工作,优化,微软)