25号下午一家公司约面试,这家公司是某集团公司新设立的研发中心,对这个公司,虽然行业涉及到机器人,我有点兴趣,但是我一直也没有太大的意愿,由于目前在职,联系面试也是一波三折,拖拖拉拉了好长时间才凑成了这次面试。不过面试倒是挺出乎意料的,也让无味的面试多了一些味道。也让我觉得这次面试还是值得的。
一般的公司的技术面试一般都是面试官先就着你的简历,先技术上探探你的虚实,挤挤你简历上的水分。就简历上的经历,尤其跟公司感兴趣的技术点相关的经历进行一番询问,在技术上对你有所把握以后,然后聊一聊你的兴趣方向啊,团队意识啊,管理意识啊、离职原因等等东东。反正我面试别人,还有我以前经历过的面试,基本上都是这个套路。技术上过关了,待遇双方可以接受,其他方面没有硬伤,一般就可以发offer了。
下午去面试,他们正在开技术会议,似乎在讨论进度啊,方案啊这些方面的内容。填完信息表以后,就等着他们头开完会。自此,套路都一样,也没在意。一会儿,他们散会了,等了一会儿,他们人事人员叫我进会议室。一个主面,两个陪同。主面的人年纪应该40开外,甚至可能有50,但是显得很有活力。另外两个就年轻很多了。一上来,主面就问我,你对公司有什么要了解的吗?一下让我措手不及(我必须承认,我的临场反应能力确实挺差的),我虽然有些准备,例如问问公司的技术开发管理方法啊,代码质量管理方法啊,项目进度保证方法啊,等等。但一般都是彼此介绍地差不多了以后,有针对性地拾漏补缺。当时觉得一上来就问这些,不是太合适。一时也想不起来问啥好。就说,你们面试比较特别啊,一般面试都是你们先问啊。主面就说,这个没有关系吧,法律也没有规定啊,即使宪法,还有5年修订一次呢。我实在想不起来,就问了问他们的技术管理方法和代码质量保证方法,尤其是新员工的代码质量如何保证,他回答基本就是weekly meeting上,小组集体进行code review。项目的结构合理性靠架构师来保证。我印象最清晰的问题是:你对自己如何评价,在技术开发人员中应该处于什么水平,我就按自己的平常的看法,略微保守,说了top 10%吧。最后被聊成说我一直在小公司,接触到的人水平比较低,在这其中的10%。当时也没想起来要反驳,其实说实在话,在我接触到的人中,自己的水平应该是first。这一点上失败。自始至终,他们也没有任何技术相关的问题,我问他们,主面说从经历和他们的问答中,他们可以了解到。但我对这个直到现在也保持怀疑。不过,公司招聘本来就是招适合自己的,并不是找技术最好的。
结束的时候,我问他们多长时间可以有结果,结果又是他问我希望多长时间有结果。这次面试中最最失败的就是我在面试结束的时候,我问他们,如果我没过面试,可不可以告诉我失败的原因。虽然,这个公司我本来就是看看而已,不是我理想的目标公司,但是这里问这个问题,实在是最最不合时宜的。
6月份面试的,当时就想这个面试值得写下来。这段时间出差较多,一直拖到今天(8.10)。直至今天,我也没有联系他们,从结束走出大门,我就意识到这些。这个面试不成功,当时我觉得是我经历的最有价值的面试。总结自己,提高自己。
一个项目在开发过程中,不可避免会遇到一些问题,出现这些问题的时候,该怎么办。目前我看到的处理方法无外乎两种,一种就是找到问题的根源,解决它。另外就是绕开它。就纯粹技术开发角度上讲,“绕”当然是不可接受的,在这之前我对待问题的基本态度也是找到根源,解决它,不然心里不舒服。但是从项目管理角度上讲,第一种方法就未必是当然的选择了,其中要考虑项目的进度等要求。8月份跳到了一家公司,在一个现有的系统上增加功能,做后续开发,和我以前对待问题的截然相反,这家公司对待问题的方法基本是能绕就绕。这可能和他们人手比较紧,追求开发效率有关系。
在我们的平台上,跑的是uC/OS,中断全部由OS接管,为了简单,程序没有中断嵌套。总得来说,我对这个系统的评价是相当低的。这个系统废代码连篇,不同的应用目标靠完全靠宏定义区分,导致程序流程很混乱。系统模块化程度非常差,耦合度很高,这导致这个系统进行改进会相当的困难。大老板的态度是现有的代码经过了测试,比较可靠,也不同意进行改进和重构,这样一来,这个系统的重构,优化,基本是不可能的事情。
最近我接手的程序出现了EEPROM读取失败的问题,经过定位,基本是读取的时候,会读出不连续的EEPROM数据,但是字节数是对的,经过今天排查,发现是由于在系统有频繁中断的时候,由于AT91SAM9G45芯片的TWI外围在都操作的时候,没有overload保护机制,读取EEPROM是如果发生其他的长时间中断,就会导致EEPROM数据被覆盖。导致操作错误。这个问题其实他们以前发现过,当时他们采取的办法是将操作EEPROM的代码换了个位置,躲避了这个问题。
总结这个事情,个人对于问题的看法是,在项目迫不得已的时候,可以采取绕的办法,但是在事后,一定要抽时间解决这个问题,不然,这个问题肯定会在以后某个时候再出来。类似地,对于系统,构建一个结构良好、强健的系统,在构建的时候可能会费时间,效率低,但这些花出去的时间一定会在以后得到回报。可惜国内负责任的程序员太少,能真正追求产品的的老板也太少,导致项目开发总是强调眼前的功能,到最后,一定是的得不偿失的。
模块化设计,模块之间的耦合度一定要低。这样无论对于扩展,延续性,健壮性都有好处。
保持清晰的Debug系统,尤其对于带有一定平台性质的项目,一定要建立一个清晰的Debug系统。Debug系统在工作的时候,不应该成为系统的瓶颈。例如,使用串口输出Debug信息,不应该使用同步方式,一定要带高速缓冲。
对touch命令,一直有个印象,但是一直不知道有什么用处,昨天才知道touch命令真是很有用的。
项目中,开发测试中,板子上的FW版本众多,后台软件也没成熟,经常要确认板子上的FW的版本,然而,又很难每次都RebuildAll,如果含有__DATE__宏的源文件没有修改,就会导致FW不能更新版本日期信息。这时候就有touch的用武之地了。
例如在我们的项目中,golbal.c中有__DATE__定义,那在IAR环境中,在Pre_build command line中,填入“touch global.c”,从此就可以高枕无忧了。
windows下是没有Touch的,可以去 http://sourceforge.net/projects/unxutils/ 下载个吧。
相关介绍来源:http://bbs.et8.net/bbs/showthread.php?t=613562
长时间公用Linux和Windows,特别喜欢Linux的命令行工作方式,特别是在分析文本,查看日志什么的,Linux的grep、head、tail、tar等命令是特别好用的,以前一直安装使用Cygwin,安装比较麻烦。
最近整理一下命令行工具,把对应xNix版的命令行工具打了个包共享给大家。
其主要来源于以下两个网站: http://www.loa.espci.fr/winnt/, http://unxutils.sourceforge.net/
SF还有一个: http://sourceforge.net/projects/picnix/
但是picnix的文件普遍比unxutils的大。
现在可以上传了。
每个执行文件都有HELP,加上–help参数就可以看见简单介绍了。
我就简单列一下我用的较多的命令和用处说一下。
cat 和dos 的type差不多 \*zip\*.exe 命令行的压缩成gz的 cmp.exe 比较文件的 compress.exe 压缩成*.Z的格式,压缩率没有gzip高 cp.exe 等于dos的copy df.exe 看磁盘空间的 diff.exe/patch.exe 给文件作补丁用的,合并差异文件,变成最新版本 echo.exe =dos echo env.exe =windows nt中的set expr.exe 表达式计算 find.exe 命令行搜索,用惯这个再也不会用windows中的文件搜索了 gawk.exe 一种脚本解释器 grep 支持正则表达式的文本分析提取程序 g\*zip\*.exe gnu 的zip程序 head.exe 用来显示一个文本文件的头部一部分内容 id.exe 显示当前用户名和组名 ls.exe 等于dos dir当然要比dir强了 mkdir =dos md mv.exe =dos move ps.exe 显示当前的进程信息,不用再看task manager了 rm.exe 类似deltree 和rd的功能 sed.exe 流编辑器 su.exe 用来切换用户的,不知道在windows里干什么 sleep.exe 暂停一段时间 sync.exe 同步程序 tail.exe 显示文件尾部内容 tar.exe 打包程序 touch.exe 修改文件时间位当前时间 un\*.exe 都是解压缩的程序 wc.exe 字数统计程序 wget.exe 下载程序,类似于flashget which.exe 搜索你的path找到你想知道某个命令对应的程序,类似于linux中的type
其中红色的命令,对程序开发员很有用。grep
用来提出日志信息,sed
用来流编辑,类似于ultraedt 中正则表达式替换功能,touch
用来更改文件时间,不需要用编辑器大开,什么都不干保存一下,tail -f filename
用来实时查看文件的内容,tar
用来打包/解tar包。
好象装个MS SFU也可以。
SFU提供一致的跨Unix操作系统平台脚本执行的能力:
最近项目中使用CAN通讯,MCP2551应该是用得比较广的CAN收发器了吧。实际使用过程中,发现有时候会开机通讯不上。最后发现出故障时MCP2551输出到CAN总线的信号CANH和CANL是一样的,极性相同。而正常情况下应该在显性位时极性相反。在Microchip的论坛上也有人发过类似经历的帖子。目前而言,还不知道什么原因,挺奇怪的,这么简单的片子,怎么会有这个问题呢。
调试LPC2368的CAN程序,出了一个奇怪的现象, 挂的CAN接收器已经能够收到报文,但是LPC2368还是不停地发送,断下来看,还在发送中,没有发送完成,当然发送也出错了。最后查发现CAN接收管脚没有配成CAN,导致CAN模块不能接收RX信号。真晕啊。