微信号:MrPeakTech

介绍:主要分享移动开发相关的技术点.

一个每天让脑子快速进入编程状态的小Tip

2016-10-12 11:09 MrPeak

写代码是门耗费脑力的手艺活。普通人一天约有40%的身体能量被大脑消耗,作为大脑的重度使用者,程序员每天对大脑的使用率可想而知。

特别是像我这样的高龄程序员,如果昨晚熬夜加过班,第二天一大早很容易脑子昏昏沉沉。

有很多大众鸡汤可以帮助Refresh Brain。比如:保持充足的睡眠,每天一杯咖啡,使用GTD,番茄工作类app,听听轻音乐等等。

今天给大家介绍一款适合程序员的小Tip。

这个Tip来自Robert C.Martin的经典书籍【clean code】or【代码简洁之道】。

从1970年开始专职写代码的Bob大叔,经过血与泪的摸索总结出了一个让大脑每天保持活跃的小技巧:

每天早晨在进入工作状态之前,先写一小段代码解决一个小问题。

这个小问题可以是任何问题,可以是经典的算法比如quick sort,也可以是工作当中需要一定思考才能解决的问题。每天早上把这个问题的解决思路花5-10分钟,用代码重演一遍。不用持之以恒,效果立竿见影。

这个办法之所以有效,在我看来,是因为大脑不用就会迟钝,懒和笨是形影不离的好兄弟。

所以明天早上,刷完微博,朋友圈和热点新闻后,来一段代码“热热脑”吧。

最后分享下我个人最近使用的样例,BFS(广度优先遍历)和DFS(深度优先遍历)的java实现。

关注我的应该大部分是iOS程序员,大家可以尝试写个Objective C或者Swift版本的BFS,DFS。

public class MainActivity extends AppCompatActivity {    private List<List<Node>> graphList;    public class Node{        char nodeName;        boolean isVisited;        public Node(char name){
            nodeName = name;
        }        public boolean isVisited() {            return isVisited;
        }        public void setVisited(boolean visited) {
            isVisited = visited;
        }        public char getNodeName() {            return nodeName;
        }        public void printNode(){
            Log.d("DailyPractice", "printing graph node with name: " + nodeName);
        }
    }    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);        //prepare test graph
        Node a = new Node('A');
        Node b = new Node('B');
        Node c = new Node('C');
        Node d = new Node('D');
        Node e = new Node('E');
        Node f = new Node('F');        //use adjacency list to represent graph
        List<Node> aList = Arrays.asList(a, b, c, d);
        List<Node> bList = Arrays.asList(b, a, e, f);
        List<Node> cList = Arrays.asList(c, a, f);
        List<Node> dList = Arrays.asList(d, a);
        List<Node> eList = Arrays.asList(e, b);
        List<Node> fList = Arrays.asList(f, b, c);

        graphList = Arrays.asList(aList, bList, cList, dList, eList, fList);        //start dfs : A B C D E F
        cleanTestData();
        dfs(a);        //start bfs : A B C D E F
        cleanTestData();
        bfs(a);
    }    public void dfs(Node root)    {
        Log.d("DailyPractice", "begin dfs algorithm");
        Stack s = new Stack();
        root.setVisited(true);
        root.printNode();
        s.push(root);        while (s.isEmpty() == false)
        {
            Node n = (Node)s.peek();
            Node child = getUnvisitedAdjacentNode(n);            if (child != null){
                child.setVisited(true);
                child.printNode();
                s.push(child);
            }            else
            {
                s.pop();
            }
        }
    }    public void bfs(Node root)    {
        Log.d("DailyPractice", "begin bfs algorithm");
        Queue<Node> q = new LinkedList<>();
        root.setVisited(true);
        root.printNode();
        q.add(root);        while (q.isEmpty() == false)
        {
            Node node = q.peek();
            Node child = getUnvisitedAdjacentNode(node);            if (child != null)
            {
                child.setVisited(true);
                child.printNode();
                q.add(child);
            }            else
            {
                q.remove();
            }
        }

    }    public Node getUnvisitedAdjacentNode(Node n){
        Node result = null;        for (List<Node> list : graphList) {
            Node firstNode = list.get(0);            if (firstNode.getNodeName() == n.getNodeName())
            {                for (Node node : list)
                {                    if (node.isVisited() == false)
                    {
                        result = node;                        break;
                    }
                }                break;
            }
        }        return result;
    }    public void cleanTestData()    {        for (List<Node> list : graphList)
        {            for (Node node : list)
            {
                node.setVisited(false);
            }
        }
    }
}

欢迎关注公众号:


 
MrPeak杂货铺 更多文章 深度优化iOS网络模块 简单几步让你的Mac系统恢复如新 iOS组件化方案 iOS内存泄漏自动检测工具LeakSniffer IPv6迁移过程当中踩的坑
猜您喜欢 用尽洪荒之力,也难说服工程师?你需要掌握这 4 个技巧 | 开源思维 一致性hash基础知识(二) PHP Liunx 服务安全防范方案 针对社群运营的5个痛点,我们给出了8点建议 灰度发布系统的实现(续)