‹

07 · Software Engineering

07 · Software Engineering

07 · ​วิศวกรรม​ซอฟต์แวร์

This chapter is the floor where a program stops being a text that runs and becomes an object that has to survive being changed.

​ชั้นนี้​คือ​จุด​ที่​โปรแกรม​เลิก​เป็น​ข้อความ​ที่​รัน​ได้ ​และ​กลายเป็น​วัตถุ​ที่​ต้อง​รอด​จาก​การถูก​แก้

Why does software rot when it has no moving parts?

​ซอฟต์แวร์​ไม่​มี​ชิ้นส่วน​ที่​เคลื่อนไหว​สัก​ชิ้น ​แล้ว​ทำไม​มัน​ถึง​ผุ (rot)?

On 1 August 2012, the trading firm Knight Capital pushed new code to the eight servers that routed its orders to the New York Stock Exchange. It arrived on seven. The eighth still carried a routine called Power Peg, which the firm had stopped using in 2003 and never deleted, and the new code had reused an old feature flag that — on that one machine — switched the dead routine back on. Over roughly forty-five minutes Knight sent millions of unintended orders into the market and lost $460 million, more than the company was worth. The Securities and Exchange Commission's order records one further detail: the dormant code had last been disturbed in 2005, when a function it depended on was moved elsewhere and nobody retested the combination (SEC Release 34-70694, 2013). Knight paid a $12 million penalty and did not survive the year as an independent firm.

​วันที่ 1 ​สิงหาคม 2012 Knight Capital ​บริษัท​เทรด​หุ้น ​ปล่อย​โค้ด​ใหม่​ลง​เซิร์ฟเวอร์​แปด​เครื่อง​ที่​ส่ง​คำสั่ง​ซื้อขาย​ไป​ตลาดหุ้น​นิวยอร์ก ​โค้ด​ไป​ถึง​เจ็ด​เครื่อง ​เครื่อง​ที่​แปด​ยังมี​รูทีน​ชื่อ Power Peg ​ค้าง​อยู่ ​บริษัท​เลิกใช้​มัน​ตั้งแต่​ปี 2003 ​และ​ไม่​เคย​ลบทิ้ง ​โค้ด​ใหม่​หยิบ feature flag ​ตัว​เก่า​มา​ใช้​ซ้ำ ​และ​บน​เครื่อง​นั้น​เครื่อง​เดียว ​มัน​ปลุก​รูทีน​ที่​ตาย​ไป​แล้ว​ให้​ทำงาน​อีกครั้ง ​ใน​เวลา​ราว 45 ​นาที Knight ​ยิง​คำสั่ง​ซื้อขาย​ที่​ไม่​ได้​ตั้งใจ​นับ​ล้าน​รายการ​เข้า​ตลาด ​ขาดทุน 460 ​ล้าน​ดอลลาร์ ​มากกว่า​มูลค่า​ทั้ง​บริษัท ​คำสั่ง​ของ Securities and Exchange Commission ​บันทึก​รายละเอียด​ไว้​อีก​จุด​หนึ่ง ​โค้ด​ที่​หลับใหล​ตัว​นี้​ถูก​แตะ​ครั้งสุดท้าย​ใน​ปี 2005 ​ตอนที่​ฟังก์ชัน​ที่​มัน​พึ่งพา​ถูก​ย้าย​ไป​อยู่​ที่อื่น ​และ​ไม่​มี​ใคร​เทสต์​ซ้ำ​ว่า​สอง​ส่วน​นั้น​ยัง​เข้ากันได้ (SEC Release 34-70694, 2013) Knight ​จ่าย​ค่าปรับ 12 ​ล้าน​ดอลลาร์ ​และ​อยู่​ไม่​ถึง​สิ้นปี​ใน​ฐานะ​บริษัท​อิสระ

Not one line of Power Peg had changed in nine years. That is the whole difficulty of this floor. Software has no bearings to wear, no metal to fatigue, no parts to fall out of tolerance; a program left alone computes tomorrow exactly what it computed today. What moves is everything around it — the hardware beneath, the libraries beside it, the regulations above it, the people who understood it. Meir Lehman gave this its name in the 1970s as the first of his laws of software evolution: a program embedded in the real world must be continually adapted or it becomes progressively less satisfactory. His second law is the sting in the tail — as such a program evolves, its complexity increases unless deliberate work is done to hold it down (Lehman, Proc. IEEE 68(9), 1980). Rot is not decay of the artifact. It is drift of the ground.

​ไม่​มี​บรรทัด​ไหน​ของ Power Peg ​เปลี่ยนไป​เลย​ตลอด​เก้า​ปี ​ความยาก​ทั้งหมด​ของ​ชั้นนี้​อยู่​ตรงนั้น ​ซอฟต์แวร์​ไม่​มี​ตลับ​ลูกปืน​ให้​สึก ​ไม่​มี​โลหะ​ให้​ล้า ​ไม่​มี​ชิ้นส่วน​หลุด​พิกัด​ความคลาดเคลื่อน ​โปรแกรม​ที่​ทิ้ง​ไว้​เฉยๆ ​จะ​คำนวณ​พรุ่งนี้​เหมือน​ที่​คำนวณ​วันนี้​เป๊ะ ​สิ่ง​ที่​ขยับ​คือ​ทุกอย่าง​รอบตัว​มัน — ​ฮาร์ดแวร์​ข้างล่าง ​ไลบรารี​ข้างๆ ​กฎระเบียบ​ข้างบน ​และ​คน​ที่​เคย​เข้าใจ​มัน Meir Lehman ​ตั้งชื่อ​เรื่อง​นี้​ไว้​ใน​ทศวรรษ 1970 ​เป็น​กฎ​ข้อ​แรก​ใน​กฎ​วิวัฒนาการ​ซอฟต์แวร์​ของ​เขา ​โปรแกรม​ที่​ฝัง​อยู่​ใน​โลก​จริง​ต้อง​ถูกปรับ​ตัวต่อเนื่​อง ​ไม่อย่างนั้น​มัน​จะ​ใช้การได้​แย่​ลง​ทีละน้อย ​กฎ​ข้อ​สอง​คือ​หนาม​ที่ซ่อน​อยู่​ท้าย​เรื่อง ​เมื่อ​โปรแกรม​แบบนี้​วิวัฒนาการ​ไป ​ความซับซ้อน​ของ​มัน​เพิ่มขึ้น​เสมอ ​เว้นแต่​จะ​มี​คน​ตั้งใจ​ลงแรง​กด​มัน​เอาไว้ (Lehman, Proc. IEEE 68(9), 1980) ​ผุ ​ไม่​ใช่​การเสื่อม​ของ​ตัว​วัตถุ ​แต่​คือ​พื้น​ใต้เท้า​มัน​เคลื่อน

Which is why this discipline is not the study of writing programs. Google's engineers put the distinction in one line: "software engineering is programming integrated over time" (Winters, Manshreck & Wright, 2020). Programming produces something that works. Engineering produces something that can be made to work again, by someone else, after the ground has moved. A script you run once and throw away needs none of this floor. A payroll system running in 2040 needs all of it.

​ศาสตร์​นี้​จึง​ไม่​ใช่​การศึกษา​เรื่อง​การเขียน​โปรแกรม ​วิศวกร​ของ Google ​สรุปความ​ต่าง​ไว้​ใน​ประโยค​เดียว "​วิศวกรรม​ซอฟต์แวร์​คือ​การเขียน​โปรแกรม​ที่​ถูก​อินทิเกรต​ไป​ตามเวลา" (software engineering is programming integrated over time) (Winters, Manshreck & Wright, 2020) ​การเขียน​โปรแกรม​ผลิต​สิ่ง​ที่ทำงาน​ได้ ​วิศวกรรม​ผลิต​สิ่ง​ที่​ทำให้​กลับมา​ทำงาน​ได้​อีก ​โดย​คนอื่น ​หลัง​พื้น​ใต้เท้า​มัน​เคลื่อน​ไป​แล้ว ​สคริปต์​ที่​รัน​ครั้ง​เดียว​แล้ว​ทิ้ง​ไม่ต้องการ​อะไร​จาก​ชั้นนี้​เลย ​ระบบ​จ่ายเงินเดือน​ที่​ยัง​รัน​อยู่​ใน​ปี 2040 ​ต้องการ​ทุกอย่าง

The first thing that floor must confront is that not all of the difficulty can be removed. Fred Brooks, who had managed IBM's OS/360 — the largest programming project of its era, and a famous struggle — split the work in two: the essential tasks, "the fashioning of the complex conceptual structures that compose the abstract software entity," and the accidental tasks, the labor of representing those structures in a language and getting them onto a machine (No Silver Bullet, 1986). Better tools attack the accidental half, and they have done so brilliantly — nobody now fights the compiler for a week. But the essential half is the specification of what the thing must actually do, tangled with everything else it must do, and no notation makes a tangled requirement simple. Brooks's prediction was that no single advance would deliver an order-of-magnitude improvement within a decade, because the part that remained was the part that was never about tooling.

​สิ่ง​แรก​ที่​ชั้นนี้​ต้อง​ยอมรับ​คือ​ความยาก​บางส่วน​กำจัด​ไม่​ได้ Fred Brooks ​ผู้​เคย​คุม​โครงการ OS/360 ​ของ IBM — ​โครงการ​เขียน​โปรแกรม​ที่​ใหญ่​ที่สุด​ใน​ยุค​นั้น ​และ​เป็นการ​ดิ้นรน​ที่​โด่งดัง — ​แบ่งงาน​ออก​เป็น​สอง​ส่วน ​ส่วน​แรก​คือ​งาน ​เนื้อแท้ (essential) ​หรือ "​การปั้น​แต่ง​โครงสร้าง​เชิง​มโนทัศน์​ที่​ซับซ้อน​ซึ่ง​ประกอบ​กัน​ขึ้น​เป็นตัว​ตน​ซอฟต์แวร์​เชิง​นามธรรม" (the fashioning of the complex conceptual structures that compose the abstract software entity) ​ส่วน​ที่สอง​คือ​งาน ​บังเอิญ (accidental) ​คือ​แรงงาน​ที่​แทน​โครงสร้าง​เหล่านั้น​ด้วย​ภาษา​หนึ่ง​แล้ว​เอา​ขึ้น​เครื่อง​จริง​ให้ได้ (No Silver Bullet, 1986) ​เครื่องมือ​ที่​ดีขึ้น​โจมตี​ความซับซ้อน​โดยบังเอิญ (accidental complexity) ​และ​โจมตี​ได้​ยอดเยี่ยม ​ทุกวันนี้​ไม่​มี​ใคร​สู้​กับ​คอมไพเลอร์​เป็น​อาทิตย์​อีกแล้ว ​แต่​ความซับซ้อน​โดย​เนื้อแท้ (essential complexity) ​คือ​สเปก​ของ​สิ่ง​ที่​งาน​นั้น​ต้อง​ทำ​จริงๆ ​พัน​กัน​ยุ่ง​อยู่​กับ​ทุกอย่าง​อื่น​ที่​มัน​ต้อง​ทำ​ด้วย ​และ​ไม่​มี​สัญกรณ์​ไหน​คลาย​ข้อกำหนด (requirement) ​ที่​พัน​กัน​ให้​กลายเป็น​เรื่อง​ง่าย​ได้ Brooks ​จึง​ทำนาย​ว่า​จะ​ไม่​มี​ความก้าวหน้า​จุด​เดียว​ที่​ทำให้​ดีขึ้น​สิบ​เท่า​ภายใน​สิบ​ปี ​เพราะ​ส่วนที่เหลือ​ไม่​เคย​เป็นเรื่อง​ของ​เครื่องมือ​ตั้งแต่​ต้น

If complexity cannot be removed, it can be confined, and this is the field's one great structural idea. David Parnas asked what makes a decomposition into modules good, and rejected the obvious answer — that modules should mirror the steps of the process. His criterion instead: "Every module … is characterized by its knowledge of a design decision which it hides from all others. Its interface … was chosen to reveal as little as possible about its inner workings" (Parnas, CACM 15(12), 1972). A module is a bet about what will change. Hide the decision that will change, and change stays local; expose it, and change propagates. Knight Capital's flag was exactly this failure made visible — a name shared between new code and code no one remembered, a coupling that existed in the machine but in nobody's head.

​ความซับซ้อน​กำจัด​ไม่​ได้ ​แต่ ​กัก​ไว้ ​ได้ ​และ​นี่​คือ​ไอเดีย​เชิง​โครงสร้าง​ที่​ยิ่งใหญ่​หนึ่งเดียว​ของ​ศาสตร์​นี้ David Parnas ​ถาม​ว่า​อะไร​ทำให้​การแตก​ระบบ​เป็น​มอดูล (module) ​ดี ​แล้ว​ปฏิเสธ​คำตอบ​ที่​ดู​ชัด​ที่สุด ​คือ​มอดูล​ควร​สะท้อน​ขั้นตอน​ของ​กระบวนการ ​เกณฑ์​ของ​เขา​เป็น​อีก​อย่าง ​มอดูล​แต่ละ​ตัว​ถูก​กำหนด​โดย​การรู้​การตัดสินใจ​เชิง​ออกแบบ​หนึ่ง​อย่าง​ที่​มัน​ซ่อน​ไว้​จาก​มอดูล​อื่น​ทั้งหมด ​อินเทอร์เฟซ​ของ​มัน​ถูก​เลือก​ให้​เปิดเผย​การทำงาน​ภายใน​น้อยที่สุด​เท่าที่​จะ​ทำได้ (Parnas, CACM 15(12), 1972) ​มอดูล​คือ​การเดิมพัน​ว่า​อะไร​จะ​เปลี่ยน ​ซ่อน​การตัดสินใจ​ที่จะ​เปลี่ยน ​การเปลี่ยนแปลง​ก็​อยู่​เฉพาะที่ ​เปิด​มัน​ออกมา ​การเปลี่ยนแปลง​ก็​ลาม​ไป​ทั่ว feature flag ​ของ Knight Capital ​คือ​ความล้มเหลว​แบบนี้​ที่​ปรากฏ​ให้​เห็น​เป๊ะๆ ​ชื่อ​เดียว​ที่​โค้ด​ใหม่​ใช้​ร่วมกับ​โค้ด​ที่​ไม่​มี​ใคร​จำได้ ​การเกาะ​เกี่ยว (coupling) ​ที่​มี​อยู่​จริง​ใน​เครื่อง ​แต่​ไม่​มี​อยู่​ใน​หัว​ใคร

The instrument that makes change survivable is the test, and its power is narrower than it looks. Dijkstra's corollary is exact: "Program testing can be used to show the presence of bugs, but never to show their absence!" (EWD249). A test suite proves nothing about the system as a whole. What it does is convert a hope — this probably still works — into a specific, mechanically re-checkable claim, and a large system is changeable in proportion to how many such claims it carries. Version control does the same job for history rather than behavior: since Git in April 2005 (Torvalds), a project's past is a queryable artifact, and the question "why is this line here" has an answer that outlives the person who wrote it.

​เครื่องมือ​ที่​ทำให้​การเปลี่ยนแปลง​รอด​ได้​คือ​เทสต์ (test) ​และ​พลัง​ของ​มัน​แคบ​กว่า​ที่​ตา​เห็น​มาก ​ข้อสรุป​ของ Dijkstra ​ตรง​เป๊ะ "​การเทสต์​โปรแกรม​ใช้​แสดง​การมี​อยู่​ของ​บั๊ก​ได้ ​แต่​ไม่​มีทาง​ใช้​แสดงว่า​บั๊ก​ไม่​มี​อยู่​ได้​เลย!" (Program testing can be used to show the presence of bugs, but never to show their absence!) (EWD249) ​ชุด​เทสต์ (test suite) ​ไม่​ได้​พิสูจน์​อะไร​เกี่ยวกับ​ระบบ​ทั้ง​ระบบ​เลย ​สิ่ง​ที่​มัน​ทำ​คือ​แปลง​ความหวัง — ​น่าจะ​ยัง​ทำงาน​ได้​อยู่ — ​ให้​เป็น​ข้อกล่าวอ้าง​ที่​เจาะจง​และ​ตรวจ​ซ้ำ​ได้​ด้วย​กลไก ​ระบบ​ใหญ่​จะ​แก้​ได้มาก​เท่าที่​มัน​แบก​ข้อกล่าวอ้าง​แบบ​นั้น​ไว้ ​ระบบ​ควบคุม​เวอร์ชัน (version control) ​ทำงาน​เดียวกัน​นี้​กับ​ประวัติศาสตร์​แทน​พฤติกรรม ​นับ​จาก Git ​ใน​เดือน​เมษายน 2005 (Torvalds) ​อดีต​ของ​โปรเจกต์​กลายเป็น​วัตถุ​ที่​คิว​รี​ได้ ​และ​คำถาม​ว่า "​ทำไม​บรรทัด​นี้​ถึง​อยู่​ตรงนี้" ​มี​คำตอบ​ที่อยู่​ยืน​กว่า​คนเขียน​มัน

The last principle is the one practitioners discover last. Melvin Conway, writing in Datamation in April 1968: "Any organization that designs a system … will produce a design whose structure is a copy of the organization's communication structure" (Conway's law). Two teams that rarely speak will build two components with a thin, brittle, under-specified interface between them, because that interface is a faithful cast of their conversation. Architecture is therefore partly a staffing decision, and reorganizations are silent design changes.

​หลักการ​ข้อ​สุดท้าย​คือ​ข้อ​ที่​คน​ทำงาน​จริง​ค้นพบ​ช้า​ที่สุด Melvin Conway ​เขียน​ไว้​ใน Datamation ​เดือน​เมษายน 1968 ​ว่า "​องค์กร​ใด​ก็ตาม​ที่​ออกแบบ​ระบบ​หนึ่ง … ​จะ​ผลิต​งาน​ออกแบบ​ที่​มี​โครงสร้าง​เป็น​สำเนา​ของ​โครงสร้าง​การสื่อสาร​ใน​องค์กร​นั้น" (Any organization that designs a system … will produce a design whose structure is a copy of the organization's communication structure) (Conway's law) ​สอง​ทีม​ที่​แทบ​ไม่​คุย​กัน​จะ​สร้าง​สอง​ส่วนประกอบ​ที่​มี​อินเทอร์เฟซ​บางเบา ​เปราะ ​และ​สเปก​ไม่​ครบ​คั่น​กลาง ​เพราะ​อินเทอร์เฟซ​นั้น​คือ​แบบ​หล่อ​ที่​ซื่อตรง​ต่อ​บทสนทนา​ของ​พวกเขา​เอง ​สถาปัตยกรรม​จึง​เป็นการ​ตัดสินใจ​เรื่อง​อัตรา​กำลังคน​อยู่​ส่วนหนึ่ง ​และ​การปรับโครงสร้าง​องค์กร​คือ​การเปลี่ยน​งาน​ออกแบบ​แบบ​เงียบๆ

The field named itself in that same year, at a NATO conference at Garmisch in October 1968, where "software engineering" was chosen deliberately to provoke — an assertion that this work ought to rest on theory and discipline the way established engineering does, made at a moment when it visibly did not (Naur & Randell, eds., 1969). Nearly sixty years on, the aspiration is still doing more work than the achievement, and the honest members of the field say so.

​ศาสตร์​นี้​ตั้งชื่อ​ให้​ตัวเอง​ใน​ปี​เดียวกัน​นั้น ​ที่​การประชุม NATO ณ Garmisch ​เดือน​ตุลาคม 1968 ​คำ​ว่า "software engineering" ​ถูก​เลือก​อย่าง​ตั้งใจ​ให้​ยั่วยุ ​เป็นการ​ยืนยัน​ว่า​งาน​นี้ ​ควร ​ตั้งอยู่​บน​ทฤษฎี​และ​วินัย​แบบ​เดียว​กับ​วิศวกรรม​ที่ตั้ง​ตัว​มา​นาน ​พูด​ใน​วันที่​เห็น​กัน​ชัดๆ ​ว่า​มัน​ยัง​ไม่​เป็น​อย่างนั้น (Naur & Randell, eds., 1969) ​เกือบ​หกสิบ​ปี​ผ่าน​ไป ​ความมุ่งหวัง​ยัง​ทำงานหนัก​กว่า​ความสำเร็จ ​และ​คนใน​วงการ​ที่​ซื่อตรง​ก็​พูด​แบบ​นั้น

Connections

​เชื่อมโยง

Below this floor sit chapters 05 and 06: the operating system and the language give you a program that runs correctly once, and everything here begins after that. Chapter 02 supplies correctness for a single algorithm; this chapter is what happens when ten thousand of them must be changed by people who never met. Above and beside it, chapters 08, 09 and 10 are the domains where these disciplines are tested hardest, because a database, a network stack, or a distributed system cannot be stopped and rewritten. Chapter 11 is the case where a leak is not merely expensive but adversarial.

​ใต้​ชั้นนี้​คือ​บท​ที่ 05 ​และ 06 ​ระบบปฏิบัติการ​กับ​ภาษา​โปรแกรม​ให้​โปรแกรม​ที่​รัน​ถูกต้อง​ได้​หนึ่ง​ครั้ง ​และ​ทุกอย่าง​ใน​บท​นี้​เริ่ม​หลังจากนั้น ​บท​ที่ 02 ​ให้​ความถูกต้อง​กับ​อัลกอริทึม​เดี่ยว​หนึ่ง​ตัว ​บท​นี้​คือ​สิ่ง​ที่เกิด​ขึ้น​เมื่อ​อัลกอริทึม​หมื่น​ตัว​ต้อง​ถูก​แก้​โดย​คน​ที่​ไม่​เคย​เจอ​หน้า​กัน ​เหนือ​ขึ้นไป​และ​ข้างๆ ​บท​ที่ 08, 09 ​และ 10 ​คือ​โดเมน​ที่​วินัย​เหล่านี้​ถูก​ทดสอบ​หนัก​ที่สุด ​เพราะ​ฐานข้อมูล ​เครือข่าย ​หรือ​ระบบ​กระจาย ​หยุด​แล้ว​เขียน​ใหม่​ไม่​ได้ ​บท​ที่ 11 ​คือ​กรณี​ที่​การรั่ว​ไม่​ได้​แพง​อย่าง​เดียว ​แต่​เป็นปฏิปักษ์​ด้วย

Open questions

​คำถาม​ที่​ยัง​เปิด​อยู่

The field's own evidence base is thin. Everyone quotes a figure for how much of software's cost is maintenance rather than initial construction, and the figures range from sixty to over ninety percent with no shared definition or measurement window behind them — a discipline that measures its central claim that loosely should be uneasy. Deeper: does machine-generated code shift Brooks's ratio, or does it merely make the accidental half cheaper while leaving the essential tangle untouched — and if reading and reviewing code becomes the bottleneck, is that a new floor or the same one? And if Conway's law holds, is it usable in reverse: can you get the architecture you want by first building the organization that would produce it?

​ฐาน​หลักฐาน​ของ​ศาสตร์​นี้​เอง​ยัง​บาง​มาก ​ทุกคน​อ้าง​ตัวเลข​ว่า​ต้นทุน​ซอฟต์แวร์​กี่​เปอร์เซ็นต์​เป็นการ​บำรุงรักษา (maintenance) ​แทนที่จะ​เป็นการ​สร้าง​ครั้งแรก ​ตัวเลข​แกว่ง​ตั้งแต่​หกสิบ​ไป​จน​เกิน​เก้า​สิบ​เปอร์เซ็นต์ ​โดย​ไม่​มี​นิยาม​ร่วม​หรือ​หน้าต่าง​การวัด​รองรับ​อยู่​ข้างหลัง ​ศาสตร์​ที่วัด​ข้อกล่าวอ้าง​หลัก​ของ​ตัวเอง​หลวม​ขนาด​นี้​ควร​รู้สึก​ไม่​สบายใจ ​ลึก​ลง​ไป​อีก ​โค้ด​ที่​เครื่อง​ผลิต​ขึ้น​เอง​ขยับ​สัดส่วน​ของ Brooks ​จริง​ไหม ​หรือ​มัน​แค่​ทำให้​ครึ่ง​บังเอิญ​ถูก​ลง ​โดย​ไม่​แตะ​ครึ่ง​เนื้อแท้​ที่​ยัง​พัน​กัน​ยุ่ง​อยู่ — ​และ​ถ้า​การอ่าน​กับ​รีวิว​โค้ด​กลายเป็น​คอขวด ​นั่น​คือ​ชั้น​ใหม่​หรือ​ชั้น​เดิม? ​และ​ถ้า​กฎ​ของ​คอน​เวย์ (Conway's law) ​เป็นจริง ​มัน​ใช้​ย้อนกลับ​ได้​ไหม — ​สร้าง​องค์กร​ที่จะ​ผลิต​สถาปัตยกรรม​แบบ​นั้น​ขึ้น​มา​ก่อน ​แล้ว​จะ​ได้​สถาปัตยกรรม​ที่​ต้องการ​หรือเปล่า?

Go deeper

​อ่าน​ต่อ

  • Titus Winters, Tom Manshreck & Hyrum Wright, Software Engineering at Google, O'Reilly, 2020 — the clearest modern statement of the time-integrated view; free in full at abseil.io.
  • D. L. Parnas, "On the Criteria To Be Used in Decomposing Systems into Modules," Communications of the ACM 15, no. 12 (1972): 1053–1058 — full text.
  • Frederick P. Brooks, Jr., "No Silver Bullet — Essence and Accident in Software Engineering," IFIP Congress, 1986 — UNC technical report.
  • Titus Winters, Tom Manshreck & Hyrum Wright, Software Engineering at Google, O'Reilly, 2020 — ​คำอธิบาย​ยุคใหม่​ที่​ชัดเจน​ที่สุด​ของ​มุมมอง​แบบ​อินทิเกรต​ไป​ตามเวลา ​อ่าน​ฟรี​ฉบับ​เต็ม​ได้ที่ abseil.io
  • D. L. Parnas, "On the Criteria To Be Used in Decomposing Systems into Modules," Communications of the ACM 15, no. 12 (1972): 1053–1058 — ​ฉบับ​เต็ม
  • Frederick P. Brooks, Jr., "No Silver Bullet — Essence and Accident in Software Engineering," IFIP Congress, 1986 — ​รายงาน​ทางเทคนิค​ของ UNC
บทถัดไป · 9 / 1608 · Databases
Size
Page
Font

The Tower of Abstractions — An Encyclopedia of the Computing Disciplines

❦
100 · The Map00 · แผนที่201 · Theory of Computation01 · ทฤษฎีการคำนวณ302 · Algorithms & Data Structures02 · อัลกอริทึมและโครงสร้างข้อมูล403 · Information & Coding03 · สารสนเทศและการเข้ารหัส504 · Computer Architecture04 · สถาปัตยกรรมคอมพิวเตอร์605 · Operating Systems05 · ระบบปฏิบัติการ706 · Languages & Compilers06 · ภาษาและคอมไพเลอร์807 · Software Engineering07 · วิศวกรรมซอฟต์แวร์908 · Databases08 · ฐานข้อมูล1009 · Networks09 · เครือข่าย1110 · Distributed Systems10 · ระบบกระจาย1211 · Security & Cryptography11 · ความปลอดภัยและวิทยาการรหัสลับ1312 · AI & Machine Learning12 · ปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง1413 · HCI & Graphics13 · ปฏิสัมพันธ์มนุษย์–คอมพิวเตอร์ และกราฟิกส์1514 · The Frontier14 · พรมแดน1699 · Closing — The Tower, Seen Whole99 · ปิดเล่ม — หอคอยเมื่อมองทั้งหลัง