当前位置: 首页 > 编程日记 > 正文

和老同事的谈话:关于职业生涯以及MDA

应该是bigtall在2007年度的最后一篇了,虽然2007年欠了大家很多帐,但是继续写应该是在2008年的事情了,很多时候非常有想法的东西,真正到落笔的时候,还是会发现欠缺许多东西,所以很多时候犹豫再三,还是不敢落笔。请大家见谅!

今天有机会见到了以前共事的同事XJ,在KFC海阔天空谈了很多,主要都是集中在各自工作和技术方面,有点启发,所以写下来备忘。大家简单看一个意思就行了。

以前觉得年龄不是一个问题,现在想来其实还真是一个大问题,不知不觉都是30出头的人了,眼看着就要“奔四”,这个日子是慢慢的后半段不如前半段长了。今后的职业生涯怎么变化,也成了一个越来越需要思考的问题。什么是“有出路”的职业?我们经过讨论,觉得定义应该是“一个不需要改行可以一直做到退休的职业”就是一个“有出路”的职业。但是现在的职业真的是一个“有出路”的职业吗?

1.年龄问题

还记得20多岁的时候曾经想着30岁的程序员会不会有人要?结果现在发现30岁的程序员其实很厉害,并没有想象中的“没人要”的情况,相反是一个“香饽饽”(不过也挺贵的)。再看看我们国外那些出书写作的,都是四五十岁的。似乎看起来很不错,但是在中国的我们到40、50的时候还会不会有人要?

2.自身问题

再看,其实周围很多同事都已经转行了,总体来说,30岁以后的程序员数量是呈现一个逐步减少的趋势。30岁之后的程序员们的生活压力却是在不断的加大:娶妻生子,还有房子(加息听说过吗?);但是自身的学习能力、身体状况却是跟20多岁的时候不一样了,还记得bigtall大学时候40个小时可以只睡2小时,现在呢?没有一两天缓不过来!

3.竞争问题

软件这个行业的新技术新思想层出不穷,所以学习是很重要的,如果不持续学习,就可能在下一波的技术浪潮中被淘汰。可是随着年纪越大,学习能力就越弱,也许现在我们可以自豪地说自己是属于剩下的20%,但是我们50岁的时候还可以这样保证?跟20岁的人比还是跟50岁的人比?

4.软件技术发展的问题

曾经有一段时间国内有些人叫嚣什么“软件蓝领”。bigtall认为喊早了,软件开发领域的职责分工随着整体水平的提高逐渐变得越来越细(10年前听说过哪家公司招聘SQA吗?),到时候别说是“软件蓝领”,就是“软件背心”出现也是迟早的事情,但是这个前提应该是分工更加细致的时候,不会是现在,恐怕也不会是2020年(也就是我们50岁)之前。但是这个是一个持续渐进的过程。MDA概念的出现,其实就是标志着“软件蓝领”慢慢出现过程的开始。用bigtall自己的信条可以来解释这个发展趋势“如果人确实是不可靠的话,就尽可能让机器来做”。当然,编码是目前冯诺依曼体系的计算机软件开发中必不可少的部分,正是因为机器不可能替代一切,所以未来会出现“软件蓝领”,当然也会出现“软件金领”(记得C#的设计者吗?)。

面临这样的趋势,如果不因势而变,要想自己的“奶酪”不被人动都很难。

5.公司发展的问题

其实小公司壮大成为大公司的概率比我们想象的都要小。那些成型的大公司(或机构),比如NASA(美国宇航局)、IBM、Microsoft甚至华为,他们的软件开发模式已经基本成熟,可以开发出高质量的软件,而且收入不小,他们有能力从人群中选择最优秀的人为他们服务,而且更会培训新人、挖掘人才。慢慢地,他们的软件开发形成了一种正向循环:好公司-好人-好制度-好软件-好收入-更好的公司-更好的人-更好的制度...

相比小公司,因为能力所限,所以会做很多短期工作,导致产品运行、维护代价太大,有不容易找到合适的人,也少有资源去培训员工,慢慢地就走向了一种负面循环:小公司-软件质量问题-收入减少-员工流失-更小的公司...除了那些有决心摒除软件开发中短视行为的公司,并且有合适的机遇,才能壮大成为大公司。其他的基本都没有未来

那么,小公司能提供给我们“有出路”的职业吗?大公司又能提供几个?要进大公司,又有几个人能入他们的“法眼”呢?

总之一句话:有危机感,也有机会。

接下来谈一下MDA的事情。因为bigtall这两年一直在关注这个问题,但是目前的软件开发现状一直不能令bigtall满意。我们目前的软件开发已经进入了“组件化”的时代,但是显然现在的“组件化”带来的好处并不如想象的那么大。

bigtall一直很羡慕IC行业的做法,他们用一块块集成电路用几个线连一下就可以弄出这么多神奇的东西,从电视到电脑,从手表到手机,从火箭到卫星(注:我说的是硬件范畴)...虽然是差异性很大的领域,但是他们基本都会用到相同的IC(航天领域的对可靠性要求有不同,但是IC模块信号差异不大)。但是相比我们的“组件”,“集成电路(IC)”的通用性确实要大的多。为什么?

通过和XJ的探讨,我们认为IC和“组件”的接口规范是一致的:一定规则的输入,一定规则的输出。但是IC的输入输出是“信号”,而“组件”的输入输出却是“数据”。不同信号之间的差别,无非集中在电压、电流、频率三个方面,而且这三个方面都相对独立,可以单独拿出来处理;但是“数据”之间的区别却太大了。我们的“组件化”过多地强调了“接口规范”但是却忘记去屏蔽掉“数据”之间的差异,而更要命的是计算机程序不仅和“数据”,而且和“数据结构”之间的耦合实在是太紧密了。泛型(Generic)的出现主要是解决了“代码”和“数据结构”之间的耦合过紧的问题。继承(Inherit)和实现(Implement)的出现部分解决了数据的差异。但是“组件”是一个运行时的东西,所以泛型对“组件”和“数据结构”之间的解耦没有帮助。真正的“组件化”时代,bigtall认为还要有“设计时”“组件”的支持。

“设计时组件”的应用场景就是在MDA中。只有“设计时组件”出现,才能解决“组件”和“数据结构”之间耦合过紧的问题,才能提供真正类似于IC应用那样的水平的“组件”。两年前参加过一个“华罗庚软件”公司的推广会(他们老总自称是华老的弟子),这个公司致力于把“数据流图”可执行化,也就是通过设计器把各种设计好的模块像积木一样连起来,最终形成一个应用程序。这个思路很好,但是软件bug太多,听半路就走了。

可见软件开发的“积木化”是很多人的理想,一个“积木式”的软件模块无非就是若干个输入,若干个输出罢了。bigtall把这种“积木化”的模块用一个汉字“”来表示:横线表示区域界线,也可以表示“积木”本身,横线上面的三个笔画表示输入,横线下面的部分表示输出。现在的情况是做一个“米”比较容易,要把一堆“米”做成一个熟饭却是相当的不容易。我们目前的“组件化”看起来依然是在“一粒生米”的阶段,离煮成“一锅熟饭”的时候还早得很。

如果我们不仅有“运行时组件”也有“设计时组件”的话,加上每一个步骤的“可自定义”特性,我想MDA就会让编程进入一个新的时代。10年前流行的4GL并没有带来什么太大改变,但是以MDA以及类似的概念恐怕会带来深刻的变化。bigtall和XJ曾经谈到了MDA代码生成的反向工程问题,提出了一个疑问:软件行业普遍存在着不设计就进行编码的问题,但是电子行业似乎没有这个做法,他们都是仔细地计算每一个IC的输入输出参数,然后装板调试,从来没有说是把IC先接起来,然后再去设计或者“补设计”。道理很简单,IC随便连起来会烧片子的,会有实际现象(比如火光、闪电等)和真实的物品的损失,现实不容许他们这么做。但是软件太灵活了,而且损失的“时间”对很多人来说无所谓(不珍惜时间算不算民族劣根性?),所以我们会有“先实现后设计”的奇怪而荒谬的做法。其实仔细想想,真的我们实现代码的时候没有“设计”过程?不是,我们都是要想好了才能去动手的,只是不习惯去把设计用文字和图画形式表现出来,稳定下来之后再去编码而已。如果MDA成为了软件开发的主要方式,这种“先实现后设计”现象自然就销声匿迹了。

当然,要真正深入去探索MDA,路还很长!

祝大家元旦快乐!新的一年里,事业顺利!进步!

相关文章:

太嚣张了!会Python的人!

随着计算机语言的发展,Python也跻身于语言排行的常青树。在当下的人工智能浪潮中,Python可以说是C位出道,成功引起了大家的注意。国内不少大公司都已经在使用Python,如豆瓣、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、热酷…

Oracle笔记 六、PL/SQL简单语句块、变量定义

1、简单SQL语句,HellWorld示例 --输出信息 begin dbms_output.put_line(Oracle Hello World!); end; 2、变量的定义、使用 --定义变量 declare sName varchar2(20); begin sName : jack; dbms_output.put_line(sName); end; --常用类型 declare sNum number(1); sCo…

mysql 5.6 uf8mb4_MySQL5.7升级到8.0过程详解

前言:不知不觉,MySQL8.0已经发布好多个GA小版本了。目前互联网上也有很多关于MySQL8.0的内容了,MySQL8.0版本基本已到稳定期,相信很多小伙伴已经在接触8.0了。本篇文章主要介绍从5.7升级到8.0版本的过程及注意事项,有想…

modules黑名单

http://www.linuxsir.org/bbs/thread321140.html今天刚看了udev的资料,说可以用blacklist禁用掉,写在/etc/modules.d/blacklist中,如:blacklist pcspkrblacklist via_agp更多的内容,还是看udev的资料吧。modules.auto…

基于tcp和udp的socket实现

2019独角兽企业重金招聘Python工程师标准>>> 本文介绍如何用Java实现Socket编程。首先介绍Java针对Socket编程提供的类,以及它们之间的关系。然后分别针对TCP和UDP两种传输层协议实现Socket编程。 1 Java中的Socket编程接口介绍 Java为Socket编程封装了几…

mysql 5.7编译安装重启_mysql5.7源码编译安装

安装mysql前的准备:一、安装依赖的库:yum install gcc-c ncurses-devel perl-Data-Dumper python-devel openssl openssl-devel二、 安装cmake(因为mysql5.7的编译由cmake来实现)安装cmake:cd cmake-2.8.8/预编译和安装:./bootst…

公开课 | 详解CNN-pFSMN模型以及在语音识别中的应用

近年来,在深度学习技术的帮助下,语音识别取得了极大的进展,从实验室开始走向市场,走向实用化。基于语音识别技术的输入法、搜索和翻译等人机交互场景都有了广泛的应用。 Librispeech是当前衡量语音识别技术的最权威主流的开源数据…

属蛇人一生运势

一生总运势 巳年生人,其性稳和才智,好安排进退,甚喜交际。有高尚的品质,受朋友好评,但其内心常有阴毒与忌妒心,致难以保持永久交情,心情易造多疑之虑,而且好色,好与人争论…

mysql邮箱配置文件_SQL-数据库邮箱配置

一、启用数据库邮件手动启用数据库邮件功能,需执行以下脚本:exec sp_configure show advanced options,1RECONFIGUREexec sp_configure Database Mail XPs,1RECONFIGURE With Override二、配置数据库邮件1、启用配置向导如果事先没有手动启用数据库邮件功…

开源可视化日志分析软件-Gource

Gource可以将代码版本控制系统里面的日志全部可视化,也就是说可以看见每个成员在系统里面提交代码的行为,Gource目前支持git、hg、svn。 静态的图片看着不过瘾,下面我将录频的效果(gourcegltail)给大家分享: http://www.tudou.com…

AI入侵机械设计,苦逼的“机械狗”还有未来吗?

作者 | Loren Grush译者 | 刘旭坤编辑 | 非主流出品 | AI科技大本营近几年,机械行业的平均薪资一直被 IT 碾压,更不用说 IT 行业里炙手可热的人工智能。现如今,AI 一路攻城略地,已经深入里很多行业和领域,其中就包括制…

[MySQL FAQ]系列 -- mysql是否支持跨库事务

作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。是可以支持的,例如这么用:start transaction; in…

docker 基本操作Ⅲ

1 数据卷备份恢复 - 我们一般用的最多的是把容器和本地宿主机做目录映射直接存在本地,但是还有一种就是数据卷的备份与恢复,如下就来介绍: 先来一副图来了解一下数据卷的恢复与备份 宿主机也就是我们的服务器分享一个/data/backup/ 目录&…

jquery操作mysql_使用jQuery从数据库访问对象

[{“日期”:“2019-02-10”,“诉状”:1},{“日期”:“2019-02-12”,“诉状”:1},{“日期”:“2019-02-14”,“诉状”:1}]我可以通过Jquery代码轻松地访问它// AJAX Request to get the data by UserID and Week 1$.get(/dashboard/performance?name document.getElementById(…

中国AI专利申请量超美国,百度居国内首位

整理 | 非主流本文数据来自《人工智能技术专利深度分析报告》随着人工智能成为新一轮科技革命和产业变革的重要驱动力量,AI 成为科技企业研发重点,专利申请量也在逐年提升。中国专利保护协会近日发布的《人工智能技术专利深度分析报告》显示,…

MySQL数据库中文模糊检索问题

我在这里谈一下 MYSQL的中文模糊搜索。我的MYSQL版本。version()5.1.22-rc-community-log这里用到的表:Table Create Table ------ -------------------------------------------------------a1 CREATE TABLE a1…

最新Python学习项目Top10!

作者 | Mybridge译者 | Linstancy整理 | Jane出品 | AI科技大本营【导读】过去一个月里,我们对近1000个Python 学习项目进行了排名,并挑选出热度前10的项目。这份清单涵盖了包括Web App, Geospatial Data, Time Paradox, Testing in Python, Crash repor…

理解HTTP消息头【很完整,例子也很丰富】

(一)初识HTTP消息头 但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。做过Socket编程的人都知道,当我们设计一…

css样式分类

1.内联式(直接在标签里写属性,属性名为style) 2.内嵌式 (直接嵌入到head标签里面,以标签形式出现,标签名为style) 选择器:用来选择标签 1:用标签选择 2:用ID选择 关键符…

hadoop mysql mybatis_MyBatis简介与配置MyBatis+Spring+MySql

MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言…

MySQL中定义fk语句_MySQL基础篇/第3篇:MySQL基本操作语句.md · qwqoo/MySQL-Review - Gitee.com...

### 第3篇:MySQL基本操作语句- MySQL基础操作#### 排序检索数据- 之前的数据没有进行排序,其是按照默认在数据表中的数据返回的- SELECT语句的ORDER BY 子句进行排序mysql# 没有特定的顺序查询 (虽然结果看起来是有序的,是因为数据表中就是这…

如何高效推进ML模型开发和部署?Uber机器学习平台Michelangelo实践

作者 | Jeremy Hermann & Mike Del Balso 译者 | 王天宇 整理 | Jane 出品 | AI科技大本营 【导读】2017年9月,Uber 在技术社区发表了一篇文章向大家介绍了 Uber 的机器学习平台 —— Michelangelo。随着平台的日渐成熟,Uber 的业务数量与能力也随…

Api 函数: GetCursorPos 与转换

//获取鼠标在窗体中的当前位置 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); varstr: string; beginstr : Format(%d,%d,[X,Y]);ShowMessage(str); end;//用 GetCursorPos 获取的是鼠标相对与屏幕的位置 varps:…

向下滚动页面导航悬浮

为什么80%的码农都做不了架构师?>>> 做两个导航,第二个隐藏 下拉到一定位置,显示第二个,position:fixed $(function(){$(window).scroll(function () {var top $(document).scrollTop();var m$(".nav")…

胜过iPhone XS?Google Pixel的“夜视功能”是怎样炼成的

作者 | Marc Levoy、Yael Pritch译者 | 刘旭坤整理 | Jane出品 | AI科技大本营【导读】随着智能手机的不断发展成熟,为了寻找差异化的厂商不断增加摄像头的数量。然而,摄像头的数量越多,就代表拍照的质量越好吗?Google Pixel 手机…

npm导入bootstrap_vue cli3.0如何通过npm引入jquery和bootstrap?

不建议通过npm的方式引入这两个东西,因为这两个东西本身就是打包好的,通过npm的方式过去,还得在webpack中排除掉,迂回。要用就直接在html中通过script和link标签引入。jQuery是时代的产物,如果要用到vue,那…

ABAP 一个隐藏 selection-screen block的实例

以下是一个演示如何通过 selection-screen 中的pushbutton来动态改变屏幕上的字段的显示状态的(即显示或者隐藏)。注意:显示 通过本示例可知selection-screen 中的 field 的显示状态都是 的,在程序中修改其属性 active 的值为 0 时…

python计算文件中字母出现次数_python – 计算文本文件中字母的频率

使用collections.Counter():from collections import Counterwith open(file) as f:c Counter()for x in f:c Counter(x.strip())正如mgilson指出的那样,如果文件不是那么大,你可以简单地做:c Counter(f.read().strip())例:>>> c…

公开课报名 | 详解CNN-pFSMN模型以及在语音识别中的应用

近年来,在深度学习技术的帮助下,语音识别取得了极大的进展,从实验室开始走向市场,走向实用化。基于语音识别技术的输入法、搜索和翻译等人机交互场景都有了广泛的应用。Librispeech是当前衡量语音识别技术的最权威主流的开源数据集…

Ruby开发环境配置

一、 RoR IDE http://deadlock.netbeans.org/hudson/job/ruby/ 你可以从这个地方下载Ruby IDE专用版本的netbeans,只有30MB大小,速度比RadRails还快!netbeans的RoR支持很强大,但也要注意两点: 1) 一定要用JDK6.0&am…