与 Marc Clifton 的程序员访谈






4.99/5 (51投票s)
欢迎来到我们持续进行的 Code Project 访谈系列,在这个系列中,我们与开发者们探讨他们的背景、项目、兴趣和最头疼的问题。在本期中,我们追踪到了 Code Project 的会员 Marc Clifton。
欢迎来到我们持续进行的 Code Project 访谈系列,在这个系列中,我们与开发者们探讨他们的背景、项目、兴趣和最头疼的问题。在本期中,我们追踪到了另一位著名的 Code Project 会员 Marc Clifton。
Marc 是两个开源项目 MyXaml 和 Interacx 的创建者。他自 2002 年以来一直是 Code Project 的会员,是社区年度 MVP,并撰写了超过 150 篇文章。 他还是社区网站 Needs & Gifts 和一款名为 Intertexti 的信息关联应用程序的创建者。
您是谁?
我叫 Marc Clifton,我住在纽约州菲尔蒙特(Philmont, New York)并在那里工作。我有一个儿子,他正在 SUNY New Paltz 学习数学教学专业,我为此感到非常骄傲。 我很幸运能在家工作近 20 年,除了在纽约市花旗集团(Citi Group)有段 5 个月的短暂经历,我宁愿将其从我的记忆中抹去。 我的通勤距离是 20 英尺,从我家到大多数我需要去的地方(无论是 农场商店 还是去马萨诸塞州大巴灵顿(Great Barrington, MA)闲逛,那里有我认为新英格兰地区最好的寿司餐厅之一)之间都没有红绿灯。 当我不工作时,我喜欢玩德州扑克,并研究 人智学,其中一些内容你可以在 我的博客上阅读,我还喜欢参与当地社区活动,提供生活指导,并享受来到这个社区的各种人才和个性,他们经常住在我的房子里。
您做什么?
我倾向于从事自动化业务流程和改进信息流的项目。这促使我开发了提高成人娱乐俱乐部(Video Simplex)、船厂管理和通信卫星(Space Systems/Loral)设计(如 DirecTV 和 Sirius 使用的)盈利能力和会计的软件。我解决了关于交换环(用于卫星切换备用发射机以延长卫星寿命)故障和寿命终结分析的复杂技术问题。 我参与的一个更有趣的项目是与 NOAA 合作,根据 3 天的温度预测来确定一批巧克力发货应包装多少冰块——好吧,那个项目只花了大约 8 个小时,但它仍然是将一家公司的需求与运输、Web 服务和 Excel 等不同技术融合的最迷人的例子之一。
我还从事过选民登记软件(Votec)的开发,“寓教于乐”游戏的开发,并帮助开发了 MX 导弹列车(幸运的是多年前被国会取消了!)的安全系统。我共同开发的视频监控安全产品几年前在 CNN 的头条新闻中被报道,用于亚特兰大奥运会。 谈论当时突破技术界限——14.4Kbps 调制解调器、自定义压缩算法、支持 5 种不同的 VGA 芯片组——那些日子真是令人难忘!
纵观我的职业生涯,我一直非常享受与硬件工程师的合作,尤其是在低光照增强摄像头系统和多光谱摄像头(Xybion Corp. 和 Robot Research,现为 Sensormatic)方面。在 挑战者号航天飞机事故之后,我职业生涯的一个亮点是开发实时光谱分析软件,以检测发射台上的 氢气火灾。 有一次,我们在进行紧急发动机关闭程序 1/4 比例测试,检查氢气火灾,令我们惊讶的是,摄像机上可见的氢气火灾完全像蛇一样缠绕在物理传感器周围,而传感器却没有任何反应!
我还开发了自己的 n 层应用程序开发环境 Interacx,我一直广泛地将其用于我的客户,并且我开发了 MyXaml 开源项目,该项目允许开发人员声明式地实例化对象图。
自两年前写下这些内容以来,我间接为一家名为 Health Connect One 的公司做了一些工作,这让我开始学习 Ruby on Rails。 我很幸运有一位了不起的导师 Eric Harris-Braun,我在东查塔姆(East Chatham)附近的 贵格会意向社区(Quaker Intentional Community)认识了他。 深入研究 Ruby 并非易事——我进入了一个由 Eric 编写的成熟的 Web 应用程序和用于描述数据录入表单的底层框架,以及一套全面的测试、部署流程等。 我的第一项任务是将一个 Web 应用程序从 Rails 2 升级到 Rails 3,这涉及到修改代码库的许多不同部分,尤其是测试场景(Ruby on Rails 拥有进行单元测试和应用程序级别测试的惊人功能),以及在 Ubuntu 中工作,这对我来说是一次全新的使用生产力工具的体验。 幸运的是,该网站的 Rails3 版本也可以在 Windows 下完全开发和测试,我必须承认,Windows 不仅对我说来是一个更舒适的环境,而且坦率地说,我认为它比 Ubuntu 更好。 在此过程中,我学到了很多关于像 Ruby 这样的动态类型语言的优缺点(查看 C# 和 Ruby 类),并用 Ruby on Rails 开发了几个网站,例如 Needs & Gifts。
我也一直在探索 ASP.NET MVC 4,并看到其中许多思想似乎是从 Rails 社区“借鉴”而来的,包括数据库迁移、整个 MVC 模型、路由等。 任何熟悉 ASP.NET 的人应该都能轻松掌握 Rails 中的概念,反之亦然。
您的开发环境是什么?
目前我主要使用 C# 和 Visual Studio 进行 WinForm 开发,以及我的一大爱好——n 层应用程序开发。 对于我的 Ruby on Rails 工作,我仍然更喜欢使用 Windows 和优秀的 RubyMine IDE。 至于数据库,我对 SQL Server、Oracle 和 PostgreSQL 都很熟悉,并惊奇地发现了序列化的 DataSet 对于轻量级客户端数据库有多么强大!
对于 n 层开发工作,我更喜欢使用我自己的产品 Interacx,因为它提供了统一的表单、架构和报表设计器(使用 DevExpress XtraReports),并具备自动 SQL 生成、变更跟踪插件、安全等功能。 Interacx 是用 C# 开发的,因此我会涉足各种 API 以进行领域无关的开发。我回避将声明性概念以命令式方式实现的想法,因此 Interacx 是我开发 n 层应用程序的首选环境。
出于这个原因,我也极其厌恶任何与 ORM 相关的东西——将数据库表或视图重新实现为一组类是我个人的观点。是的,在处理数据时 ORM 有其用武之地,但我的大部分工作涉及数据的正确呈现和挖掘,这在任何情况下都不涉及 ORM——它在 SQL 级别完成,并且通常以视图的形式体现。 此外,没有必要添加额外的层,因为数据可以直接绑定到控件。 当然,这一切之所以有效,是因为七年前我写了一些跟踪 DataTable 事务的代码,这是我的 SQL 生成器的后盾(从未写过关于它的文章)。 我认为,七年前的代码至今仍在我开发的应用程序中使用,这说明了很多问题。 Ruby on Rails 的工作当然使用了 ORM,它是 Rails 框架的后盾之一——它功能强大且易于使用,而且由于这里的 ORM 存在于 Web 服务器上,因此在 2 层级别使用 ORM 更为合理——对于客户端代码,2 层方法几乎不再是考虑因素,对我而言是 3 层或 n 层。
硬件方面,我已经升级了我两年前使用的设备:一台 HP 台式机,配备 8GB RAM、64 位 Windows Vista(家庭版,你敢信?)和 1TB 硬盘。 最近,我用一块 8 核 AMD FX-8320 处理器(3.8Ghz)、16GB RAM 和两个 120GB SSD 组装了自己的系统——空间足够我所有需要,但开始有点拥挤了。 在使用 Ubuntu 时,我使用 Virtual Box 在虚拟机中运行 Ubuntu,并为其分配 4 个处理器和 4GB RAM。
我仍然在 Gateway I5 笔记本电脑(和两年前用的是同一台)上进行大量开发,但最近我订购了另外 4GB RAM,使其达到 8GB——我应该去查收一下邮件,内存应该随时会到! 考虑到 WiFi 热点的普及,我放弃了 Sprint MiFi 卡。 我还有一个专用服务器(Peer1),但它严重利用不足——我的网站完全处于混乱状态——但它是所有源代码的中央存储库,使用 Subversion。 我的笔记本电脑实际上与我的台式机是克隆的,包括一个资源更有限(1GB,2 处理器)的 Ubuntu 虚拟机。
我不确定自己是否有最喜欢的语言。我怀念具有多重继承的 C++(当你需要它时,你真的需要它)和 STL(C# 的泛型根本不行)——接口无法替代多重继承! 我喜欢 C# 的反射功能,自从上次写这个之后,我真的很享受 lambda 表达式和 LINQ。 我在初次接触 Ruby 时对它非常着迷,尽管它的性能当然远不如编译型语言。 我后来对在动态类型语言中编写优秀代码需要更多的纪律有了更深入的理解——基本上,假装你在使用强类型语言,并且绝对避免 猴子补丁——你的代码以及你使用的任何框架代码都应该有足够好的架构,以至于不需要猴子补丁。 所以,如果你有足够的纪律并且性能足够,Ruby on Rails 是一个构建复杂网站的相当不错的语言和框架。
我最喜欢的 WinForm 开发框架是我自己的(它应该是我自己的,对吗?)至于第三方组件,我非常喜欢 DevExpress,但希望它更简单——我猜非常强大和简单是矛盾的——所以我封装了我使用的 DevExpress UI 类,并自动化了我想要的行为,一旦我弄清楚如何让 DevExpress 做我想做的事。这样,我就不必再费心去研究了!
您对哪些新工具、语言或框架感兴趣?
目前,我对语言和框架的兴趣已明显减退。 我曾经对 XML(我知道,它不是一门语言,但请耐心听我说)及其在声明式编程中的应用着迷。 然后我对 F# 以及所有与函数式编程相关的东西产生了兴趣,当然最后是 Ruby。 归根结底,我观察编程社区,仍然认为,这些东西都没有在开发代码和满足最终用户需求方面取得重大进展。 整个 Web 应用程序的格局在我看来就像一个 鲁布·戈德堡 的机器,建立在 20 多年前的 最初的 18 个 HTML 标签之上,说实话,我感到很失望——似乎是竞争的供应商和标准让我们这些架构师/开发者在管道像旧锅炉房一样漏水般的环境中工作。
话虽如此,我绝对有兴趣继续我的 计算类型和 关系导向编程的探索,我最近从一篇 Insider News 文章中了解到,这与 图数据库(Graph Database),例如 Neo4j 是相同的。 那就是我目前的兴趣所在,我正在努力决定是继续做 WinForm 开发,还是拥抱“黑暗面”,更多地从事 Web 应用程序领域的工作。
您最讨厌的编码习惯是什么?
美学。代码不仅应该漂亮,而且应该看起来和格式化得漂亮。当开发者不将他们的语句对齐,并且在使用空格方面不一致时,我简直要疯了。对我来说,代码是一件艺术品,我认为开发者对代码外观、架构和用户角度的质量所付出的关怀程度之间存在关联。
有三件事我非常讨厌
- 成员字段使用下划线
- 区域(我想看到整个内容)
- “this.” 符号,这是 IntelliSense 早期不够及时但需要对象引用时的遗留产物。
除此之外,我对命名约定没有偏好,只要它得到一致的应用,并且类在委托、枚举、字段、属性、构造函数和方法方面得到了妥善组织。
我还要补充一点,现在两年过去了,尤其是在 Ruby 这样的语言中,我非常讨厌在社区代码中看到随意使用符号和字符串哈希键,以及普遍回避面向对象实践的现象。 动态类型可能导致各种缺乏约束和混乱的代码——在我拥有多年使用强类型语言的经验之后,看到 Ruby 社区缺乏公认的架构和编码实践,这让我抓狂。
您是如何开始编程的?
在我六年级的时候,我在一台 PDP–11 电传打字机上的第一个按键(按照说明)是按 Ctrl+C,结果电脑崩溃了。原来磁带驱动器的电源与 CPU 相连,所以如果磁带驱动器消耗的电流过大,就会导致 CPU 崩溃。我迅速离开了学校的电脑室,一年都没有再碰那东西。
我在这台机器上学会了 BASIC,编写了我的第一个 联邦 vs. 罗慕兰人游戏(每轮打印一个 10x10 的网格),并将我的程序保存在穿孔纸带上。我费尽心力才理解计算机是如何“知道”当我写 A=5 时,稍后 A 仍然等于 5 的。第二年,我就在教 BASIC 了。
高中毕业后,我深入研究了汇编语言(这仍然是我的初恋,我认为编程应该只用汇编语言编写!),为 Commodore PET 和 Fairchild 游戏杆编写了我的第二个星际迷航游戏,这个游戏取得了小小的商业成功,并开启了我的这段冒险之旅。
开发者社区是如何影响您的编码的?
我记得当我第一次使用 C# 时,我正在试图弄清楚如何在不使用断点的情况下强制调试器在某个地方中断。我来自 C/C++ 环境,在那里我只需发出一个“int 3”汇编语言指令,我就想也许 C# 中也需要做类似的事情。 在线搜索时,我没有找到任何内容,于是我弄清楚了如何在 C# 中发出指令,并迅速发表了一篇关于该主题的文章,心想:“哦,我做了件很酷的事。” 我收到的第一批回复之一是“我想你不知道 System.Diagnostics.Debugger.Break();”。
哦,我的自尊心!
但这说明了开发者社区,尤其是网络社区,是如何影响我的编码的——.NET 框架中充满了我不了解的东西。所以,我喜欢即使是一篇简单的文章或博客利用了我不知道的 .NET 或 C# 语言中的某个东西(可能甚至不是文章的主题)。我看到一些人使用的 LINQ 或 lambda 表达式,我想,他们是怎么弄清楚这些的?所以,正是这些最后的 10%,那些有些晦涩、很少使用但有时非常有用的编码特性,是我喜欢阅读并影响我自己的代码的。
今天的开发者社区有很多值得喜欢的地方。经常光顾 The Code Project 和 StackOverflow 的人们会及时回答问题,我也得到了很好的答案。当我寻找答案时,也有大量的知识可以挖掘。令我惊讶的是,我在博客上发现了多少答案,但这可能仅仅是因为 Google 的搜索偏好。
我不喜欢的是,坦率地说,某些微软博客作者的“公关宣传”,然后这些宣传会被其他开发者社区采纳。我不喜欢对新技术的大肆宣传,“更快、更少 Bug”的口号。我唯一一次成功地减少 Bug 的方法就是做得更慢!我不明白为什么营销人员会认为开发者会蠢到相信这些宣传,但话说回来,那些产品宣传语可能不是以开发者为目标受众来写的。
我也不喜欢教学视频。我宁愿要一份写得好的文档,我可以轻松地加入书签、交叉引用、在空白处写一些笔记等等。但话说回来,写文档比拼凑一个低分辨率视频要花更长的时间。这太糟糕了,因为在我看来,我们彼此都在做着不利的事情。
基本上,我使用的在线资源只有 Google、Code Project 和 StackOverflow。Google 经常将我引向 MSDN 和各种人的博客,仅此而已。我真正花时间浏览的唯一论坛是 Code Project 的 Lounge。我的其他在线时间都花在非开发者网站上(别有什么想法!)处理科学和哲学问题。
您会对一个新兴的程序员提供什么建议?
我的第一位雇主 Paul Zuzelo,在我 18 岁的时候,花时间和耐心将这一点灌输给我:学会清晰地沟通(用人类语言,而不是计算机语言)1)你试图解决的问题,以及 2)你将如何解决这个问题。 现在我想补充一点“成为一个自律的程序员——学习你正在使用的语言和工具,看看它们如何被滥用,并避免这样做!”