我在 1969 年写代码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://csdnnews.blog.csdn.net/article/details/100012479

 

640?wx_fmt=gif

【CSDN 编者按】1969年,人类第一次登月,计算机功不可没。那么50年前的程序员是则那样编程的呢?这位 72 岁的女程序员说:铅笔写代码,打印机打印。

640?wx_fmt=jpeg

来源 | ilikebigbits.com

译者 | 风车云马,责编 | 伍杏玲

出品 | CSDN(ID:CSDNnews)

以下为译文:

2018年12月,我的母亲玛丽安·埃尔纳费尔特(Marianne Ernerfeldt)接受了我的采访。她是一位早期从事编程的女程序员,你可以想象到,这在当时那个年代是很不可思议的事情。

640?wx_fmt=jpeg      

Punch cards

 

640?wx_fmt=png

我为什么想成为一名程序员?

 

在1965-1966年间,我决定成为一名程序员。因为我在一篇文章上看到一幅编程的流程图,感到这个职业很适合我。

1967年,我高中毕业时,那时还没有大学教授编程的课程。但Solna(索尔纳,位于瑞典)有一个为期6个月的培训课程(后来变成了12个月),且它可以申请学生贷款,所以我参加了。

与此同时,一家垄断企业SJ(瑞典国有铁路公司)发布了招聘实习生的广告,提供为期一年的带薪培训项目,在那可以学习SJ运营的所有不同项目。SJ有一个计算机部门,所以我也申请了SJ项目,希望能在那里工作。

当时有700人申请SJ的50个职位,每个人面临艰难的选择过程和各种各样的测试。我很需要这份工资来买公寓,幸好我经过重重考验了。

当时SJ的管理层发现培训手册同时发给男学生和女学生,他们非常不高兴。毕竟女性在这行并不被人们看好,这个项目录取的女性并不多。

在培训期间,我们参观了SJ的所有部门,了解了火车、铁路通信工作原理(SJ有自己的电线和通信设备)。在1969年,SJ开始了一个内部编程培训项目,我再次申请了。经过多轮测验,我和其他两个女生、一个男孩通过了编程培训。

       640?wx_fmt=jpeg      

1976年IBM System/370的参考资料

 

640?wx_fmt=png

先进的编程培训

 

我们首先参观了SJ计算机部门,了解计算机的基本概念。紧接着我们在IBM上课,斯德哥尔摩的一栋大楼里有一台“训练机”。我们班上大概有50-100人,每个房间里有8个人。每个教室前面布置了两个电视屏幕,分别显示老师和黑板上的内容。每个老师大概负责10个教室,每个教室都可以用麦克风和按钮进行提问和作答。

是不是很先进呢?

首先我们学习了一些关于IBM OS的知识,然后我们学习了PL/I,这是IBM自己的编程语言。它是Cobol的一个更现代的版本,具有更高级的特性,比如生成表和查询。所以PL/I在当时是一种比较高级语言,也更简单。可以使用英语单词编写代码,如DO WHILE等。

在第一节IBM课程之后,我在SJ开始了我的第一个实践项目。我们四个人做了一个约会程序,输入男人和女人的特征后,用我们自己发明的算法产生一个匹配。

后来我学了更多的课程,比如汇编。我在这里接受了一周的教育,对我今后的工作受益匪浅。

       640?wx_fmt=jpeg      

流程图模板,用于将数据流以及事件发生的逻辑顺序进行可视化

 

640?wx_fmt=png

铅笔写代码,打印机打印

 

我们画好流程图后,用铅笔写完代码,然后用打字机打印出来。打印纸有80列,程序占72列,排序号占8列,所以每一行代码最多可以有72个字符。

我们必须把代码写清楚,这样打字人员才能读懂。打字人员除了打印SJ的时间报告、每列火车行驶的距离等等,还会打印我们的程序代码。

刚开始的时候,程序很小,但后来可能变成几米长的卡片盒。每一行代码打印一张卡,对应每一张卡片有一条指令,所以打字机会把程序打印为成千上万张卡片。

我们还必须创建“控制卡”来区分要编译还是要执行,以及它是什么语言等等。控制卡有一个单独的颜色,上面有程序员的名字,打字员知道最终该把东西还给谁。

然后操作员拿着卡片盒子运行程序。有时我们每天只有一次运行机会,因为我们程序员在机器大厅中拥有的优先级最低。

最后,这些卡片连同“pajama paper”一起返回,其中包含错误代码和行号的列表。

  640?wx_fmt=jpeg 

 

Pajama paper

我们必须创建测试文件,看看程序是否产生了预期的结果。如果没有,我们就用笔和纸思考到底出了什么问题? (那时称为“桌面测试”)。因此,要使程序正确运行可能需要相当长的时间。

我们从一开始就有IBM 360,还有一些更老的机器。后来我们得到了IBM 370。

在70年代末,我们有了终端。

之前我们从来没有自己的终端机,而是共用一个终端机室。当我们想要对程序进行更改时,我们不得不争用终端时间。我们可以在终端屏幕上看到程序,还可以修改它。当时我们有黄色和棕色的Alfaskop终端。在1979年离开SJ之前,我从未拥有过自己的终端机。

       640?wx_fmt=jpeg      

Alfaskop 3700

 

640?wx_fmt=png

“非专业”出身的程序员同事

 

SJ的计算机部门大约有40名程序员和系统工程师。我所有的同事都像我一样,在公司内部接受培训,只有少数例外。有几个和我年龄相仿的人参加了我之前提到的索尔纳为期6个月的课程。除此之外,没有其他的方法来学习这个。这是一个全新的职业,有些同事曾经是司机,并且大多数人甚至没有高中文凭。

系统工程师的工作主要与规格、程序的输入和输出等有关。作为程序员,我们是问题的解决者,我们制作流程图并找出解决问题的方法。

在机器大厅里大约有10名机器操作员。他们穿着白大褂,处理磁带存储、磁盘和打字卡。我们很少被允许进入机器大厅的内室。入口处有一个“关门”的牌子。机器厅很大。早期的机器(IBM 1400)占据了10 - 20 m²的空间,后来机器演变为小冰箱那么大小。

在40名程序员中,我们有5到6名女性。我是这群年轻人中的一员,但大多数程序员都比我大10岁左右(我出生于1947年)。在20世纪70年代末,我们招募了一些新员工,他们接受了为期12个月的培训。

在我开始上班之前,我遇到了SJ计算机部门的同事索维格,她告诉我所有女员工的门牌都有写着“Miss X”或“Mrs. X”(小姐/太太),但男员工的门上没有相应的婚姻状况信息。女人们对此非常生气,她们撕掉牌子。所以当他们问我的门牌时:“你也不想要这个Miss/ Mrs.吧?”“不,谢谢。”我说。 

 

640?wx_fmt=png

我从事的工作

 

1969年春天,SJ推出了在线预订服务,24/7正常运行时间。它在当时非常先进,完全是用汇编程序编写的。这是SJ真正杰出的地方之一,在瑞典没有其他公司能与我们相提并论。我很幸运能在这样一家敢于冒险的公司。

一旦这些程序创建完成并经过测试,我们就把它们交给其他人。有专人负责维护它们,我们只是编写新的程序,这些程序主要用来收集关于操作的统计数据(例如工资单),然后每个月定期运行。

1979年,在SJ工作了十年之后,我辞职去了银行部门工作。

原文:

http://www.ilikebigbits.com/2019_07_08_programming_in_1969.html

本文为CSDN翻译,转载请注明来源出处。

【END】

这几个Python技能实战,能让你少些1000行代码!

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

9.5-7日 AI 开发大会(AI ProCon),7位出品人集结国内外60+技术大咖,探秘9大核心技术,深剖行业痛点,亚马逊首席科学家李沐还将亲授「深度学习集训营」,助力开发者实现技术跃迁。

640?wx_fmt=jpeg

 热 文 推 荐 

DOS 入侵、群发邮件、心脏起搏器……病毒攻击简史!

我为什么反对 Google 拍卖 Android 搜索引擎选项?

传阿里收购网易考拉谈崩;iOS 13 被指涉嫌垄断;新版 Edge Beta 浏览器发布 | 极客头条

柬埔寨月薪 4 万敲代码?真相是我差点丢了性命!

ImageNet错误率小于4%,数据量依然不够,N-Shot Learning或是终极解决之道?

Python冷知识,不一样的技巧带给你不一样的乐趣

kafka系统设计开篇

干货!学霸用12个决策模型告诉你,如何判断你到底需不需要区块链!

如何写出让同事无法维护的代码?

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

 

 

 

 

 

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

展开阅读全文

指点下我代码

10-25

刚转学c#,写了一点点代码 ,请指点下,我这样写行不? rn最好多发表自己的意见。。rn万分感谢!rnrnusing System;rnusing System.Collections.Generic;rnusing System.Text;rnusing System.Data.SqlClient;rnusing System.Data;rnrnnamespace Member_databasernrn public class sqldbconnectionrn rn public static SqlConnection mysqlcon = new SqlConnection("server=.;userid=sa;password=123;database=member");rn rn public void Mysql_conOpen() rn rn tryrn if (mysqlcon.State == ConnectionState.Open) rn rn if (mysqlcon.State == ConnectionState.Closed)rn mysqlcon.Open();rn rn rn catch (Exception ex)rn if (ex!= null) mysqlcon = null;rn rn rnrn public void Mysql_conClose()rn rn tryrn if (mysqlcon.State == ConnectionState.Open)rn mysqlcon.Close();rn mysqlcon.Dispose();rn rn if (mysqlcon.State == ConnectionState.Closed)rn mysqlcon.Dispose();rn rn catch (Exception ex)rn if (ex != null) mysqlcon = null;rn rn rn rn public static SqlDataReader SqlReader(string SqlCmd)rn rn SqlDataReader sqldr = null;rn // Mysql_conOpen;rn SqlCommand cmd = new SqlCommand(SqlCmd, mysqlcon);rn tryrn sqldr = cmd.ExecuteReader();rn catch (Exception ex)rn if (ex != null) sqldr = null;rn rn return sqldr;rn rnrn public static SqlCommand Ex_SqlCmd(string sqlcmd)rn rn SqlCommand cmd = null;rn // Mysql_conOpen();rn cmd = new SqlCommand(sqlcmd, mysqlcon);rn tryrn cmd.ExecuteNonQuery();rn catch (Exception ex)rn if (ex != null) cmd = null;rn rn return cmd;rn rnrn public static DataTable Read_table(string sqlcmd)rn rn DataTable dt = null;rn dt = new DataTable();rn SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);rn tryrn da.Fill(dt);rn catch (Exception ex)rn if (ex != null) dt = null;rn rn return dt;rn rnrn public static DataSet Read_Dataset(string sqlcmd)rn rn DataSet ds = null;rn ds = new DataSet();rn SqlDataAdapter da = new SqlDataAdapter(sqlcmd, mysqlcon);rn tryrn da.Fill(ds);rn catch (Exception ex)rn if (ex != null) ds = null;rn rn return ds;rn rn rnrn 论坛

展示一段我代码

08-27

[code=C#] public class Linern rn private ConcurrentQueue intQueue = new ConcurrentQueue(Enumerable.Range(0,10000));rnrn private ConcurrentQueue< Task< double>> calculateQueue = new ConcurrentQueue>();rnrn private ConcurrentQueue> factorialQueue = new ConcurrentQueue>();rnrn private ConcurrentBag resultBag = new ConcurrentBag();rnrn private Task CalculateTask(int i)rn rn TaskCompletionSource tcs = new TaskCompletionSource();rn double d = i;rn tryrn rn tcs.SetResult(Math.Acos(Math.Cosh(Math.Cos(Math.Tan(Math.Tanh(d))))));rn rn catch (Exception ex)rn rn tcs.SetException(ex);rn rn return tcs.Task;rn rnrn private Task Factorial(double de)rn rn Func tempFuc = delegate(double d)rn rn long i = Convert.ToInt64(d);rn long result = 1;rn while (i > 0)rn rn result = i * result;rn i--;rn rn return result;rn ;rn return Task.Factory.FromAsync(tempFuc.BeginInvoke(de, null, null), tempFuc.EndInvoke);rn rnrn private void AddCalculate()rn rn int i;rn while (intQueue.TryDequeue(out i))rn rn calculateQueue.Enqueue(CalculateTask(i));rn rn rnrn private void AddFactorial()rn rn Task task;rn while (calculateQueue.TryDequeue(out task))rn rn double d = task.Result;rn factorialQueue.Enqueue(Factorial(d));rn rn rnrn private void AddQueue()rn rn Task task;rn while (factorialQueue.TryDequeue(out task))rn rn long l = task.Result;rn if (l<500&&l>0)rn rn intQueue.Enqueue(Convert.ToInt32(l));rn rn resultBag.Add(l);rn rn rnrn public void mainFuc()rn rn Parallel.Invoke(() => AddCalculate(); , () => Thread.Sleep(1000); AddFactorial(); , () => Thread.Sleep(3000); AddQueue(); );rn rn rn[/code] 论坛

的Filter代码问题:

03-19

代码:rnimport java.util.regex.*;rnpublic class test rnrn public static String test(String s)rn rn Pattern p;rn Matcher m;rn StringBuffer sb;rn boolean result;rn String reg="\\[size=([1-4])\\](.[^\\[]*)(\\[\\/size\\])"+rn "|\\[face=(.[^\\[]*)\\](.[^\\[]*)(\\[\\/face\\])"+rn "|\\[align=(.[^\\[]*)\\](.[^\\[]*)(\\[\\/align\\])"+rn "|(\\[B\\])(.[^\\[]*)(\\[\\/B\\])"+rn "|(\\[I\\])(.[^\\[]*)(\\[\\/I\\])"+rn "|(\\[U\\])(.[^\\[]*)(\\[\\/U\\])"+ rn "|(\\[CENTER\\])(.[^\\[]*)(\\[\\/CENTER\\])"+rn "|\\[em([0-9]*)\\]";rn p = Pattern.compile(rn reg,rn Pattern.CASE_INSENSITIVE);rn m = p.matcher(s);rn sb = new StringBuffer();rn result = m.find();rn while(result&&m.group(0)!=null) rnrn if(m.group(1)!=null)rn m.appendReplacement(sb,""+m.group(2)+"");rn else if(m.group(4)!=null)rn m.appendReplacement(sb,""+m.group(5)+"");rn else if(m.group(7)!=null)rn m.appendReplacement(sb," "+m.group(8)+"");rn else if(m.group(10)!=null)rn m.appendReplacement(sb,""+m.group(11)+"");rn else if(m.group(13)!=null)rn m.appendReplacement(sb,""+m.group(14)+"");rn else if(m.group(16)!=null)rn m.appendReplacement(sb,""+m.group(17)+""); rn else if(m.group(19)!=null)rn m.appendReplacement(sb,""+m.group(20)+"");rn else if(m.group(22)!=null)rn m.appendReplacement(sb,"");rn result = m.find();rn rn m.appendTail(sb);rn return sb.toString();rn rn public static void main(String[] args)rn rn String s="123s1234[em09]ofd[align=cent]safd[/align][size=4]safdsao[/size]456";rn s=test(s);rn System.out.println(s);rn rnrnrnrnrn123s1234ofdsafdsafdsao456rnrnrn你仔细看看就知道,[b][/b][u][/u][i][/i][center][/center]几个标签在程序中没有其作用,但是其它标签却起作用了,rn如果这几个也起作用的话,输出应该是::123rn儿不是::123rn 论坛

的一段代码(莫名其妙)

06-05

存储过程:rnCreate PROCEDURE dbo.selectinteractivetxtrn @size intrnASrnbeginrndeclare @sqlstr nvarchar(300)rnset @sqlstr='select top'+str(@size)+' id,WebName,WebDomain,txtCount FROM WeberInteractive WHERE (Status = 1) ORDER BY txtCount%100' rn exec(@sqlstr)rn endrn RETURNrnrnCreate PROCEDURE dbo.updateinteractivetxtcountrn @id bigintrnASrnupdate WeberInterActive set txtCount=txtCount+1 where id=@idrn RETURNrnrnrnrnpublic StringBuilder GetTxt()rn rn string StyleType;rn StringBuilder builder = new StringBuilder();rn SqlCommand mySqlCommand = new SqlCommand();rn mySqlCommand.CommandType = CommandType.StoredProcedure;rn mySqlCommand.CommandText = "selectinteractivetxt";rn mySqlCommand.Connection = mySqlConnection;rnrn mySqlCommand.Parameters.Add(new SqlParameter("@size", SqlDbType.Int)); //add parameter @sizern mySqlCommand.Parameters["@size"].Value = 1; //数量rnrn SqlCommand mySqlCommand1 = new SqlCommand();rn mySqlCommand1.CommandType = CommandType.StoredProcedure;rn mySqlCommand1.CommandText = "updateinteractivetxtcount";rn mySqlCommand1.Connection = mySqlConnection;rnrn SqlDataAdapter MydataAdapter = new SqlDataAdapter();rn MydataAdapter.SelectCommand = mySqlCommand;rn MydataAdapter.UpdateCommand =mySqlCommand1;rn rn SqlParameter id = MydataAdapter.UpdateCommand.Parameters.Add("@id",SqlDbType.BigInt);rn id.SourceColumn = "id";rn id.SourceVersion = DataRowVersion.Original;rnrn DataSet ds = new DataSet();rn OpenSql(mySqlConnection);rn MydataAdapter.Fill(ds,"table1");rn CloseSql(mySqlConnection);rn builder.Append("");rn foreach (DataRow dr in ds.Tables["table1"].Rows)rn rn builder.Append("" + dr["WebName"].ToString() + dr["txtCount"] + " ");rn dr["txtCount"]=10;rn rn MydataAdapter.Update(ds, "table1");rn builder.Append("");rn return builder;rn 论坛

代码指点一二

11-03

其中的一个方法,看看有什么问题,指点一下,谢谢程序能不能这么写 会不会有问题rn[code]rnrn public Integer doInsert(final ManageObject obj)rn con = ConDWDVLP.getDWDVLP();rn logger.debug("Create InsertConnection:"+con);rn boolean flag = false;rn String sql = "select distinct * from DIM_MG_OBJECT where Detail_Code = '"+obj.getDETAIL_CODE()+"'";rn try rn PreparedStatement stmt = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,rn ResultSet.CONCUR_UPDATABLE);rn rs = stmt.executeQuery();rn logger.debug("SQL:"+sql);rn flag = rs.last();rn logger.debug("flag is "+flag);rn catch (SQLException e) rn try rn if(con!=null)con.close();rn catch (SQLException e1) rn e1.printStackTrace();rn rn logger.debug("Insert data is error! ",e);rn rn if(!flag)rn return (Integer)JDBCTransactionTemplate.doTransaction(new Transaction()rn rn public Object execuse(Connection Iner_con) throws SQLException rn logger.debug("Get Iner_con:"+Iner_con);rn int bol = 0;rn String sql1 = "insert into "rn + "DIM_MG_OBJECT(FMLY_CODE,FMLY_NAME,MID_CODE,MID_NAME,DETAIL_CODE,DETAIL_NAME,LEGACY_ITEM,SHOP_SIGN,PRODUCT_CODE,PRODUCT_NAME,PRODUCT_CAT,CREATE_MAN,MODIFY_MAN,REMARK,ALIVE_FLAG,CREATE_DATE,MODIFY_DATE,META_STR_ID,META_STRUCTURE) "rn + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,sysdate,sysdate,?,?)";rn PreparedStatement stmt = Iner_con.prepareStatement(sql1);rn stmt.setString(1, obj.getFMLY_CODE());rn stmt.setString(2, obj.getFMLY_NAME());rn stmt.setString(3, obj.getMID_CODE());rn stmt.setString(4, obj.getMID_NAME());rn stmt.setString(5, obj.getDETAIL_CODE());rn stmt.setString(6, obj.getDETAIL_NAME());rn stmt.setString(7, obj.getLEGACY_ITEM());rn stmt.setString(8, obj.getSHOP_SIGN());rn stmt.setString(9, obj.getPRODUCT_CODE());rn stmt.setString(10, obj.getPRODUCT_NAME());rn stmt.setString(11, obj.getPRODUCT_CAT());rn stmt.setString(12, obj.getCREATE_MAN());rn stmt.setString(13, obj.getMODIFY_MAN());rn stmt.setString(14, obj.getREMARK());rn stmt.setString(15, "Y");rn stmt.setString(16, obj.getMETA_STR_ID());rn stmt.setString(17, obj.getMETA_STRUCTURE());rn bol = stmt.executeUpdate();rn logger.info("ManageDAO--insert DIM_MG_OBJECT Table:"+bol+"row");rn if(obj.getFMLY_CODE().equals("SRM"))rn String sql2 ="insert into dim_coef_price(FMLY_CODE,FMLY_NAME,MID_CODE,MID_NAME,DETAIL_CODE,DETAIL_NAME,META_STR_ID,META_STRUCTURE,ALIVE_FLAG,CREATE_MAN,CREATE_DATE,MODIFY_MAN,MODIFY_DATE)"rn + " values(?,?,?,?,?,?,?,?,?,?,sysdate,?,sysdate)";rn stmt = Iner_con.prepareStatement(sql2);rn stmt.setString(1,obj.getFMLY_CODE());rn stmt.setString(2, obj.getFMLY_NAME());rn stmt.setString(3, obj.getMID_CODE());rn stmt.setString(4, obj.getMID_NAME());rn stmt.setString(5, obj.getDETAIL_CODE());rn stmt.setString(6, obj.getDETAIL_NAME());rn stmt.setString(7, obj.getMETA_STR_ID());rn stmt.setString(8, obj.getMETA_STRUCTURE());rn stmt.setString(9, "Y");rn stmt.setString(10, obj.getCREATE_MAN());rn stmt.setString(11, obj.getMODIFY_MAN());rn bol = stmt.executeUpdate();rn logger.info("ManageDAO--insert dim_coef_price table:"+bol+"row");rn if(!(bol>0))rn throw new SQLException();rn rn elsern String sql3 ="insert into DIM_CONVERT_FORMULA(FMLY_CODE,FMLY_NAME,MID_CODE,MID_NAME,DETAIL_CODE,DETAIL_NAME,META_STR_ID,META_STRUCTURE," +rn "ALIVE_FLAG,CREATE_MAN,CREATE_DATE,MODIFY_MAN,MODIFY_DATE) " +rn "values(?,?,?,?,?,?,?,?,?,?,sysdate,?,sysdate)";rn stmt = Iner_con.prepareStatement(sql3);rn stmt.setString(1, obj.getFMLY_CODE());rn stmt.setString(2, obj.getFMLY_NAME());rn stmt.setString(3, obj.getMID_CODE());rn stmt.setString(4, obj.getMID_NAME());rn stmt.setString(5, obj.getDETAIL_CODE());rn stmt.setString(6, obj.getDETAIL_NAME());rn stmt.setString(7, obj.getMETA_STR_ID());rn stmt.setString(8, obj.getMETA_STRUCTURE());rn stmt.setString(9, "Y");rn stmt.setString(10, obj.getCREATE_MAN());rn stmt.setString(11, obj.getMODIFY_MAN());rn bol = stmt.executeUpdate();rn logger.info("ManageDAO--insert DIM_CONVERT_FORMULA table:"+bol+"row");rn if(!(bol>0))rn throw new SQLException();rn rn rn rn if(stmt!=null)stmt.close();rn return new Integer(bol);rn rn );rn else rn try rn if(con!=null)con.close();rn logger.debug("Close Connection:"+con+"is Succeed!");rn catch (SQLException e) rn logger.debug("Close Connection:"+con+"is Defeat!",e);rn rn return new Integer(2);rn rn rn[/code] 问答

没有更多推荐了,返回首页