• Feeds

  • 选择学习目标的方法与自然法则

    不少工作多年的朋友都会有时间失控的焦虑,工作已经在设计好的轨道上运行,日常时间被例行的工作及各种琐事占据,大部分时间并不是由自己主动控制。每天还有不少突发的任务从邮件、电话、通讯软件等各种渠道涌入,挤掉了主动去做一些事情的时间。一些担任管理岗位的人员甚至每天大部分时间是由秘书安排。生活上重要的事项一再被拖延,许多时间一再决定下次有时间时候一定要做但是一直都没做。

    另外一种情况,在时间可以主动把控的情况下,不少朋友也会碰到选择目标的问题,几个月前写的选择目标的困难与焦虑提到

    工程师如果某段时间没有学习目标,就会有一种来自内心虚度年华焦虑。

    文章也引起了一些同行的共鸣,不少朋友在后台留言询问解决的建议,而那篇文章的目的更多的是提出一些问题引发思考,而究竟怎么解决则需要每个人去自己寻找答案。并且当时也没有非常好的值得广泛借鉴的。

    最近看了Hyrum W. Smith的10 Natural Laws of Successful Time and Life Management一书,1995年出版的,已经比较久远,刚出不久的中文版叫高效能人士的时间和个人管理法则,里面提到一些方法可以帮助我们更好的来控制时间及选择目标。

    law1

    书中提到的自然法则(natural laws)是类似“万有引力”这样的自然中的基本模型,不管我们同意与否,自然法则会独立于我们而存在。了解一些时间及目标管理的自然法则,可以帮助我们卓有成效的利用每一天时间。而我觉得最有参考意义的自然法则,就是确定“核心价值”这一点。

    看到这一点时,每个人可以先问下自己核心价值是什么?关爱亲人及自身健康是大部分人核心价值的一部分,如果如此,那每天所做的最重要的事情是否包括这些?每个人还可以列出其他一些相对于自己生命中最重要的事情,如经济安全、事业有成、获得专业声誉及影响力等。判断一个目标是否属于核心价值则可以用自然法则去判断,比如用能不能失去做判断,或者假设生死关头最不能舍弃的元素来排序,排序最前面则是你关注的核心价值。

    列出核心价值之后,你再可以去检查每天所做的事情是否属于核心价值,并根据核心价值的优先级程度对要做的事情进行排序,如果你的健康排在第一位,则每天你最重要的事情则是做一些让自己保持健康的投入,而不是把健康的问题拖延,让一些不重要的紧急任务占据你所有的时间优先级。每天起床后可以抽出15分钟时间去规划当天的时间计划,确保核心价值的事情得到了优先安排,如果一个人的核心价值是想取得事业上的成就,为了让事业有成,短期及长期要做什么?当天是否在主动促进?当检查完的核心价值,再回顾每天的日常轨道上那些事情,如果发现大部分时间是在做和核心价值无关的事情,那建议尽早去整理自己的优先级列表,让每天所做事情根据自己的核心价值的对应顺序进行优先级排序。

    Smith提出激光思考的方法,如果在太阳底下我们使用一个放大镜,将阳光聚焦在一点就可以让树叶燃烧起来。激光思考也是类似的思路,让我们每天的时间聚焦在我们最应该关注的事情上面,并且持续投入,就会产生激光效应。有非常多的技巧及方法让一个人专注,当他意识到哪些事情值得投入的时候,方法通常不会成为问题。

    google_calendar

    上图是一个假设的一天时间计划,并按照优先级进行了排序。假定主人公的价值观排序是:1、家庭;2、健康;3、职业成就与专业声誉;4、学习与个人修养。通过Google Calendar,我们可以将日程设置颜色,上述的1、2设置成绿色,3设置成黄色,4设置成灰色。当然你也可以通过标注A/B/C/D这样来区分优先级。通过工具,我们可以方便的将时间投入在核心目标上。时间计划切忌排太满,需要留出一些空余时间应对突发事件。而Smith的工具则是纸面的表格,可能1995年电子日程工具还不太成熟。纸上的日程有个好处,做完后划掉后会产生巨大的满足感,大脑会分泌一种叫做内啡肽的化学物质,它会给你带来注射吗啡一样的快感。

    最近网上一些讨论提到不少人群大量时间被通讯及社交软件占满的现象,一方面,移动网络拉近了人与人之间距离,可以随时随地保持连接。但在另外一方面,日常大量的时间也被微信聊天、朋友圈、微博等软件占据。一些人觉得罪魁祸首是这些软件,通过避免使用这些软件来把控时间,这诚然是一种方法。但问题如第二段所述,有一部分人每天即使能空出不少碎片时间,也存在不知道该投入在什么地方的问题。只有明确了自己每天更值得投入的目标,社交软件的问题自然可以很理智的去取舍。

    每一天都应为自己的核心价值而行动。

    Linux Load编程竞赛

    Linux load average的意思就是说 目前有ready的进程 但是cpu都在满,然后这个数是一分钟的平均值。公式:loadvg = tasks running + tasks waiting (for cores) + tasks blocked. 让CPU满是最简单的方式

    为了更好理解load average,Tim某天在群征集一段代码使load average最高。于是乎,群友纷纷出手。

    Erlang版

    [~]$ cat load10
    #!/usr/bin/env escript
    %% -- erlang --
    %%! -smp enable -sname load10
    main(_) ->
    I = erlang:system_info(scheduler_id),
    random(5).
    
    random(I) when I > 10 ->
    random(I+1);
    random(I) ->
    spawn(fun() -> random(I+1) end),
    random(I+1).
    

    此代码将Linux load跑到了10-20,取得了领先

    Shell版

    #!/bin/sh
    for((i=0;i<10;i++));do
    {
    for((j=0;j<1000000000000;j++));do echo '1'>>1; done
    }&
    done
    

    Ruby

    ruby -e "require 'thread';t = Mutex.new;10.times {fork {10000000.times{t.synchronize {x=Time.now}}}}"
    

    Java版

    import java.io.*;
    
    public class LoadTest {
    
      public static void main(String[] args) throws IOException, InterruptedException {
          int count = 1000;
          for (int i = 0; i < count; i++) {
              final Thread t = new Thread(new Runnable() {
                  public void run() {
                      try {
                          while (true) {
                              RandomAccessFile file = new RandomAccessFile("/tmp/test.bin", "rw");
                              file.seek(1024 * 1024 * 500);
                              file.write(1);
                              file.close();
                          }
                      } catch (IOException e) {
                      }
                  }
              });
              t.start();
          }
          Thread.currentThread().join();
      }
    }
    

    C语言版

    void main () {
    int i=0;
    for (i = 0; i < 1000; i++) {
    if (fork () > 0) {
    continue;
    }
    while (1) ;
    }
    getchar();
    }
    

    此版本远远超过了上面的Erlang版本,将load拉到1000+

    Java版本2

    public class Test {
    
       public static void main(String[] args) {
           for (int i = 0; i < 1000; i++) {
               new Thread() {
                   @Override
                   public void run() {
                       while (true) ;
                   }
               }.start();
           }
       }
    }
    

    此版本和上面C版本效果类似

    部分讨论:

    不对呀,这个方法以前不行
    CentOS 6吧[惊讶]
    CentOS 5
    有几个版本有bug,cpu的hz拿的不对,load特别低,7就好了[坏笑]

    Java版本3

    写两类线程,一类进行lockObject wait, 一类进行lockObject notifyall。 cpu上下文切换消耗 竞争激烈。Load能很高。

    public class LoadHighDemo {
    
       public static void main(String[] args) throws Exception {
           LoadHighDemo demo = new LoadHighDemo();
           demo.runTest();
       }
    
       private void runTest() throws Exception {
           Object[] locks = new Object[5000];
           for (int i = 0; i < 5000; i++) {
               locks[i] = new Object();
               new Thread(new WaitTask(locks[i])).start();
               new Thread(new NotifyTask(locks[i])).start();
           }
       }
    
       class WaitTask implements Runnable {
    
           private Object lockObject = null;
    
           public WaitTask(Object obj) {
               lockObject = obj;
           }
    
           public void run() {
               while (true) {
                   try {
                       synchronized (lockObject) {
                           lockObject.wait(new java.util.Random().nextInt(10));
                       }
                   } catch (Exception e) {;
                   }
               }
           }
       }
    
       class NotifyTask implements Runnable {
    
           private Object lockObject = null;
    
           public NotifyTask(Object obj) {
               lockObject = obj;
           }
    
           public void run() {
               while (true) {
                   synchronized (lockObject) {
                       lockObject.notifyAll();
                   }
                   try {
                       Thread.sleep(new java.util.Random().nextInt(5));
                   } catch (InterruptedException e) {
                   }
               }
           }
       }
    }
    

    上物理机把5000个线程改成更多,如50000也行。
    直接while true改5000应该能更多……
    我的应该能一直上涨, load 1000, 2000, 3000

    可以试试parkNanos(1)

    刚才卡了。。。
    看来不能在本机上跑

    Python版

    把5分钟 load avg 稳定在1024了
    在本群感到了一种情怀。。。

    #!/usr/bin/env python
    import os
    import sys
    import time
    
    def load_add_1():
    time.sleep(30)
    fd=os.open("test.txt",os.O_CREAT|os.O_RDWR|os.O_SYNC, 0644)
    for i in xrange(10000*100):
    os.write(fd," "*100)
    sys.exit(0)
    
    for i in xrange(8192):
    if os.fork() == 0:
    load_add_1()
    

    此版本将load跑到8192

    C语言版本2

    https://gist.github.com/hongqn/37cdfde04d0c5a03fede

    #include <unistd.h>
    #include <stdio.h>
    
    #define LOAD 16384
    
    int main() {
    int i;
    char s[256];
    
    for (i=0; i<LOAD; i++) {
    if (vfork()) {
    return 0;
    }
    }
    scanf("%s", s);
    return 0;
    }
    

    macbook 上 virtualbox 里一个 2G mem 单 core cpu 的虚机就可以轻松达到16,000
    这个的原理是通过 vfork 产生指定个数的 D 状态进程,从而提高 load

    Vfork() differs from fork in that the child borrows the parent’s memory and thread of control until a call to execve(2) or an exit (either by a call to exit(2) or abnormally.) The parent process is suspended while the child is using its resources.
    vfork 的子进程只要不 execve 或者退出,父进程就一直挂着(在D状态)。这里就是让最后一个子进程用 scanf 等输入

    通过以上题目,你是看到了热闹,还是看到了门道?

     

    ArchSummit 2015深圳见闻

    这几天参加了ArchSummit深圳全球架构师峰会,AS深圳的地点一直都选在大梅沙,这次大会在海湾大酒店举行。

    两天的ArchSummit大会日程比较紧凑,再加上大多数时候有6个专题在并行,因此每个人能够真正去听的课程不会太多。如果刚好碰到朋友多聊几句,能真正听的场次就更少了。

    第一场是LinkedIn一个技术经理演讲Big Data Story,数据的重要性在各行各业已经体现出来,关键是每个领域需要自己去思考如何更好的挖掘及应用数据。

    下午选了一个在线教育的专场听了几个分享,基本都是围绕线教育领域的大数据应用。由于对在线教育缺少了解,不知是专题选题的缘故还是在线教育的门槛确实提高了,听到的几个案例都是比较偏大数据算法。猿题库研究部总监邓澍军介绍了拍照搜题功能中Deep Learning技术的应用,从介绍的案例来看,识别的门槛还是比较高,不知道与业界其他一大批搜题领域的创业公司技术实力是什么级别的差异。

    第二天主题也比较丰富,印象比较深的是由微信朋友圈负责人陈明的分享。朋友圈后端目前只有3个工程师,讲师以Instagram及whatsapp为例,认为目前小团队存在一定程度的优势。朋友圈的技术特色主要有分布式多机房的设计,以及由多机房架构带来的异地数据一致性问题的产生,微信采用的策略是因果一致性,主要目的是让同一个图片下不同机房回复的用户评论保证因果次序。(可参考分享的ppt进一步了解)

    有不少人参会多的人会觉得参加几次大会后收获越来越小,在某种程度,也可能跟装满水的杯子道理相似,工作多年,形成了自己的解决问题的经验及思维定势,虽然别的方法更好,但从心理的角度,可能总觉得不如自己原先的方法。

    两天的会议开完后,会议在大梅沙海边的游艇会上有一个party,运营ArchSummit(包括InfoQ)的极客邦科技的老板-Kevin Huo同学给大家组织了精彩的活动,也在演讲中讲述了他一向的观点,技术人员在社会上应该得到最好的对待。因此特地选择了在海边的游艇会,看乐队的演出,吃着烧烤,喝着啤酒,聊聊技术与人生。

    PS: ArchSummit所有slides都已经放出,可以在stu.org官网获得。