คอมพิวเตอร์ หน้าต่าง อินเทอร์เน็ต

โปรแกรมเมอร์ควรรู้อะไรบ้าง? ช่างเขียนโปรแกรมมีหน้าที่อะไร Programmer จำเป็นต้องรู้และสามารถทำอะไรได้บ้าง?

โปรแกรมเมอร์ 1C มือใหม่ควรรู้อะไรบ้าง

ในบทความนี้เราจะดูประเด็นหลักที่โปรแกรมเมอร์ 1C มือใหม่ควรรู้ สิ่งนี้อาจเป็นประโยชน์สำหรับผู้ที่ใช้ 1C:Enterprise และตั้งใจที่จะทำด้วยตนเองโดยไม่ได้รับการสนับสนุนจากภายนอก

เริ่มต้นด้วยคำจำกัดความ:

แพลตฟอร์ม 1C:องค์กร –นี่คือสภาพแวดล้อมซอฟต์แวร์พื้นฐานที่โซลูชันแอปพลิเคชัน (การกำหนดค่า) ทำงาน แพลตฟอร์มนี้เป็นพื้นฐานที่โปรแกรมเมอร์ทำงานและสร้างโซลูชันสำเร็จรูปสำหรับผู้ใช้ปลายทาง

การกำหนดค่าเป็นโปรแกรม (โซลูชันแอปพลิเคชัน) ที่พัฒนาบนพื้นฐานของแพลตฟอร์ม 1C: Enterprise และออกแบบมาเพื่อทำให้งานการจัดการและการบัญชีเป็นอัตโนมัติในพื้นที่กิจกรรมเฉพาะ

การกำหนดค่าพื้นฐาน 1C

สำหรับโปรแกรมเมอร์มือใหม่ สิ่งสำคัญคือต้องทราบการกำหนดค่าพื้นฐาน 1C ที่บริษัทส่วนใหญ่ใช้งานด้วย

การกำหนดค่า 1C ทั่วไปที่พบบ่อยที่สุดมีน้อย - น้อยกว่าสิบ ผู้เชี่ยวชาญด้านการเขียนโปรแกรมจะต้องเข้าใจความแตกต่างระหว่างการกำหนดค่าอย่างชัดเจนเพื่อทำความเข้าใจว่าข้อมูลใดถูกจัดเก็บไว้ในโปรแกรมและวิธีการประมวลผล

ตัวอย่างเช่น 1C: การบัญชีได้รับการออกแบบเพื่อทำให้กระบวนการบัญชีในองค์กรเป็นอัตโนมัติและช่วยให้คุณสามารถเก็บบันทึกตามข้อกำหนดของหน่วยงานกำกับดูแลของสหพันธรัฐรัสเซีย

เพื่อรักษาบันทึกบุคลากรและบัญชีเงินเดือน คุณต้องศึกษา 1C: เงินเดือนและการจัดการบุคลากร ในกรณีนี้โปรแกรมเมอร์จะต้องสามารถสร้างความสัมพันธ์ระหว่างบุคลากรและเอกสารการชำระเงินได้

เพื่อให้การบัญชีคลังสินค้า การจัดซื้อ การบัญชีการเงิน และการรายงานการปฏิบัติงานเป็นไปโดยอัตโนมัติ 1C: การจัดการการค้าจะถูกใช้ เป็นผลิตภัณฑ์ซอฟต์แวร์นี้ที่ได้รับการดัดแปลงบ่อยที่สุดเพื่อให้เหมาะกับความต้องการของบริษัท

1C: การค้าปลีก - เวอร์ชันแก้ไขของ 1C: การจัดการการค้า และมีไว้สำหรับระบบอัตโนมัติของร้านค้าปลีกที่มีข้อมูลเฉพาะต่างๆ การกำหนดค่า 1C นี้เป็นสากลสำหรับร้านค้าใด ๆ โดยพื้นฐานแล้วโปรแกรมเมอร์ 1C ได้พัฒนารูปแบบต่างๆสำหรับร้านค้าในอุตสาหกรรมต่างๆ

การกำหนดค่าเหล่านี้และการกำหนดค่าอื่น ๆ ทั้งหมดทำงานบนแพลตฟอร์ม 1C:Enterprise เท่านั้น หากผู้ใช้ไม่ได้ติดตั้งแพลตฟอร์มก็จะไม่สามารถใช้โปรแกรมได้

ภาษาการเขียนโปรแกรม 1C


แพลตฟอร์ม 1C:Enterprise มีภาษาการเขียนโปรแกรมของตัวเอง ซึ่งพัฒนาโดยบริษัท 1C และกำหนดฟังก์ชันการทำงานของโซลูชันแอปพลิเคชันอย่างสมบูรณ์ แพลตฟอร์มจะกำหนดชุดของออบเจ็กต์พื้นฐานด้วยคุณสมบัติและวิธีการของตัวเอง ซึ่งได้แก่ ค่าคงที่ เอกสาร ไดเร็กทอรี รีจิสเตอร์ และอื่นๆ อีกมากมาย ออบเจ็กต์เหล่านี้ทั้งชุดใช้เพื่อแก้ไขปัญหาระบบบัญชีอัตโนมัติต่างๆ

ภาษาการเขียนโปรแกรม 1C ในตัวเป็นแบบเฉพาะเรื่อง โปรแกรมเมอร์ที่มีประสบการณ์กล่าวว่าภาษาการเขียนโปรแกรม 1C ในตอนแรกดูง่ายกว่าภาษาอื่นเล็กน้อย ปัญหาอยู่ที่ว่าโปรแกรมเมอร์จำเป็นต้องเข้าใจสาขาวิชาที่โปรแกรมดำเนินการโดยอัตโนมัติ เช่น การบัญชี การผลิต การบัญชีการจัดการ ฯลฯ คุณสมบัติอีกประการหนึ่งของภาษาการเขียนโปรแกรม 1C ที่ทำให้ผู้เริ่มต้นประหลาดใจคือโค้ดสองภาษา ซึ่งหมายความว่ารหัสสามารถเขียนเป็นภาษารัสเซียหรือภาษาอังกฤษได้

พื้นฐานของการทำงานกับฐานข้อมูล 1C

ฐานข้อมูลคือข้อมูลที่แพลตฟอร์มใช้งานได้ ประเภทของข้อมูล และวิธีการประมวลผลจะถูกกำหนดโดยการกำหนดค่าที่ใช้ โปรแกรม 1C หนึ่งโปรแกรมสามารถมีฐานข้อมูลได้หลายฐานข้อมูล โดยทั้งหมดจะมีโครงสร้างเดียวกัน แต่แต่ละโปรแกรมสามารถคำนึงถึงข้อมูลที่แตกต่างกันได้ บริษัทขนาดใหญ่มักจะไม่ใช้ฐานข้อมูลเดียว แต่ใช้หลายฐานข้อมูล

เช่น ฐานการบัญชีและฐานเงินเดือน หลังจากคำนวณการชำระเงินทั้งหมดในฐานข้อมูลเงินเดือนแล้ว ข้อมูลจะต้องถูกถ่ายโอนไปยังแผนกบัญชีเพื่อชำระภาษี

โปรแกรมเมอร์ 1C ยังมีส่วนร่วมในการซิงโครไนซ์และแลกเปลี่ยนข้อมูลระหว่างฐานข้อมูล

พื้นฐานของภาษาแบบสอบถาม 1C

ขั้นตอนที่สำคัญมากในการเรียนรู้การเขียนโปรแกรม 1C คือการเรียนรู้ภาษาคิวรี

คำขอ- นี่เป็นหนึ่งใน 1C หลัก: เทคนิค Enterprise พร้อมด้วยภาษาในตัวที่ช่วยให้คุณอ่านและประมวลผลข้อมูลที่เก็บไว้ในฐานข้อมูล

ภาษาแบบสอบถามถูกสร้างขึ้นเพื่อให้แน่ใจว่าผู้ใช้ได้รับข้อมูลจากฐานข้อมูลในรูปแบบที่สะดวก เมื่อใช้ภาษาคิวรี ข้อมูลสามารถประมวลผลหรือจัดกลุ่มได้เท่านั้น ไม่สามารถเปลี่ยนแปลงข้อมูลโดยใช้แบบสอบถามได้

พื้นฐานของกลไกการโต้ตอบกับโปรแกรมอื่น

ใน 1C:Enterprise สิ่งสำคัญคือต้องกำหนดค่าการอัปโหลดข้อมูลจาก Microsoft Office เพราะ บ่อยครั้งที่คุณต้องบันทึกรายงานและข้อมูลแบบตารางต่างๆ ในไฟล์ Excel หรือ Word หรือในทางกลับกันในการโหลดข้อมูลจาก Excel คุณต้องสร้างการประมวลผลพิเศษ ก่อนอื่นคุณต้องทำการตั้งค่าทางเทคนิคทั้งหมด อ่านข้อมูลจากไฟล์และสร้างคอลัมน์ที่มีชื่อคล้ายกันใน 1C

พื้นฐานของการบัญชี คลังสินค้า หรือการค้าขาย

มีเพียงการดูตำแหน่งงานว่างเท่านั้น: โปรแกรมเมอร์ 1C ทุกวินาทีต้องการความรู้เกี่ยวกับการบัญชีและการบัญชีการจัดการ ตามที่กล่าวไว้ข้างต้น โปรแกรมเมอร์จะต้อง "เข้าใจ" พื้นที่ที่เขาทำงานอยู่ เพื่อที่จะจัดรูปแบบการประมวลผลและสร้างอัลกอริธึมอย่างถูกต้อง ตรรกะของโปรแกรมจะต้องมีความชัดเจน

ในสถานการณ์ที่นักบัญชีผู้เชี่ยวชาญด้านเทคนิคตีคู่กันมีสถานการณ์: โปรแกรมเมอร์ไม่เข้าใจสิ่งที่นักบัญชีต้องการจากเขาและนักบัญชีไม่เข้าใจว่าโปรแกรมมีความสามารถอะไรและทำงานอย่างไร เพื่อหลีกเลี่ยงความเข้าใจผิด คุณต้องพูดภาษาเดียวกัน ในการทำงานร่วมกับผู้ใช้โปรแกรม 1C: การบัญชี ผู้เชี่ยวชาญด้านเทคนิคจะต้องเข้าใจ "ตรรกะของนักบัญชี" เชี่ยวชาญคำศัพท์และรู้พื้นฐานของการบัญชี นักบัญชีมักใช้แบบฟอร์มเอกสารที่แก้ไข ตัวอย่างเช่นในการบัญชีใบนำส่งสินค้าหรือเปลี่ยนสกุลเงินทางบัญชี ภารกิจหลักของโปรแกรมเมอร์ 1C คือการดูแลให้นักบัญชีทำงานอย่างสม่ำเสมอ ส่งรายงานตรงเวลา และการวิเคราะห์เอกสารที่ฝังไว้จะไม่สูญหาย

จัดระบบทักษะพื้นฐานและเรียนรู้การแก้ปัญหาที่ซับซ้อนโดยใช้

นักพัฒนาซอฟต์แวร์มีส่วนร่วมในการเขียนโปรแกรมสำหรับคอมพิวเตอร์ประเภทต่างๆ อาชีพที่มีความคิดสร้างสรรค์ส่วนใหญ่ต้องใช้ทักษะ ความรู้ และประสบการณ์เป็นจำนวนมาก แต่สิ่งแรกที่โปรแกรมเมอร์ต้องรู้คือคุณสมบัติส่วนบุคคลที่ตัวแทนของสภาพแวดล้อมนี้มีคุณสมบัติอะไรบ้าง สาขาเทคโนโลยีสารสนเทศไม่ได้หยุดนิ่งและมีการพัฒนาอย่างรวดเร็ว ผู้เชี่ยวชาญที่แท้จริงจะต้องตระหนักถึงการเปลี่ยนแปลงทั้งหมดอยู่เสมอ ซึ่งหมายความว่าเขาต้องการความสนใจอย่างมากและมีแนวโน้มที่จะเรียนรู้ด้วยตนเอง

สิ่งต่อไปที่คุณต้องรู้คือภาษาอังกฤษ Developer ทุกคนรู้อย่างน้อยก็ในระดับเทคนิค เพราะด้วยความช่วยเหลือนี้ จะทำให้เข้าใจคำสั่งของภาษาโปรแกรมส่วนใหญ่ได้ง่ายขึ้น ต่างประเทศกำลังพัฒนาเร็วที่สุดในด้านการพัฒนาซอฟต์แวร์ ดังนั้นภาษาอังกฤษจึงมีประโยชน์ในการทำความคุ้นเคยกับข่าวสารล่าสุดในด้านนี้

ทุกวันนี้หลายคณะของสถาบันการศึกษาระดับสูงไม่เพียง แต่อธิบายรายละเอียดสิ่งที่จำเป็นสำหรับการเป็นโปรแกรมเมอร์เท่านั้น แต่ยังฝึกอบรมผู้เชี่ยวชาญด้วยทักษะพื้นฐานที่จำเป็นในสาขาคณิตศาสตร์และฟิสิกส์ในทันที อย่างไรก็ตาม นักพัฒนาหลายคนแย้งว่าการศึกษาระดับอุดมศึกษาในด้านนี้ไม่ใช่สิ่งสำคัญ สิ่งสำคัญมากกว่าที่นี่คือสามารถค้นหาวิธีแก้ปัญหาที่ไม่ได้มาตรฐานและประสบความสำเร็จในกระบวนการทำงาน

ประเด็นต่อไปนี้ที่โปรแกรมเมอร์จำเป็นต้องรู้จะขึ้นอยู่กับขอบเขตงานของผู้เชี่ยวชาญ ตัวอย่างเช่น สำหรับนักพัฒนาเว็บไซต์ การใช้โปรแกรมแก้ไขกราฟิกรวมถึงความรู้เกี่ยวกับภาษาการพัฒนาเว็บไซต์สมัยใหม่ถือเป็นสิ่งสำคัญมาก หนึ่งในนั้นคือ PHP

คนที่คิดเรื่องนี้ควรเข้าใจว่าความรู้พื้นฐานของภาษานั้นยังไม่เพียงพอ เพื่อให้ได้งานที่ดีและค่าตอบแทนที่เหมาะสม คุณต้องเข้าใจ OOP ซึ่งใช้ในการเขียน Framework และ CMS ยอดนิยม การทำงานด้วยคือขั้นตอนต่อไปของสิ่งที่โปรแกรมเมอร์ PHP จำเป็นต้องรู้

ในปัจจุบันการทำความคุ้นเคยกับการทำงานของฐานข้อมูล MySQL ที่พบบ่อยที่สุดก็เพียงพอแล้ว ผู้เชี่ยวชาญที่แท้จริงไม่น่าจะสามารถทำได้หากไม่มีภาษาโปรแกรม HTML และ CSS แม้ว่า PHP จะเป็นภาษาเซิร์ฟเวอร์ แต่ก็มีความเกี่ยวข้องโดยเฉพาะกับการประกอบหน้าเว็บที่เขียนด้วย HTML คุณจะต้องมีความรู้เกี่ยวกับไวยากรณ์ JavaScript และความเข้าใจในการทำงานของเฟรมเวิร์กทั่วไป - JQuery หรือ ExtJS ทุกวันนี้ การใช้เครื่องมือสมัยใหม่เหล่านี้ให้เชี่ยวชาญไม่ใช่เรื่องยากด้วยความช่วยเหลือของบล็อกและหลักสูตรออนไลน์มากมาย

เมื่อมีความรู้เกี่ยวกับสิ่งที่ต้องใช้ในการเป็นโปรแกรมเมอร์และเป็นเจ้าของพวกเขา คุณสามารถเลือกกิจกรรมต่างๆ ได้ เช่น การเขียนโปรแกรมเพื่อทำให้ธุรกิจของบริษัทเป็นแบบอัตโนมัติ การพัฒนาและปรับปรุงเว็บไซต์และแอปพลิเคชันให้ทันสมัย ในขณะเดียวกันก็ไม่จำเป็นต้องทำงานในตำแหน่งถาวรในบริษัทใดๆ เลย คุณสามารถค้นหาคำสั่งซื้อที่น่าสนใจได้อย่างอิสระโดยไม่ต้องออกจากบ้านหรือจัดระเบียบธุรกิจของคุณเองซึ่งอาจกลายเป็นแหล่งความสำเร็จที่แท้จริงได้ อย่างไรก็ตาม การดำเนินการดังกล่าวจะต้องอาศัยความรู้เพิ่มเติมในด้านเศรษฐศาสตร์ การจัดการโครงการ และนิติศาสตร์

โปรแกรมเมอร์มือใหม่หลายๆ คน โดยเฉพาะผู้ที่ศึกษาในมหาวิทยาลัยประจำจังหวัด มักไม่รู้ว่าควรพัฒนาไปในทิศทางไหน และต้องรู้อะไรบ้างเพื่อที่จะทำงานเฉพาะด้านได้อย่างมีประสิทธิภาพ น่าประหลาดใจที่ทุกวันโดยใช้ผลิตภัณฑ์และเทคโนโลยีที่สร้างขึ้นโดยโปรแกรมเมอร์คนอื่น ๆ โดยอิงจากความรู้ที่พัฒนาแล้ว พวกเขาไม่รู้ด้วยซ้ำว่าทำงานอย่างไร

เครือข่ายการสื่อสารเคลื่อนที่ที่สร้างขึ้นจากทฤษฎีการเข้าคิวและมาตรฐาน GSM สคริปต์ PHP ดำเนินการบนเซิร์ฟเวอร์ระยะไกลและส่งเอาต์พุตผ่านอีเธอร์เน็ตผ่าน TCP/IP ไปยังคอมพิวเตอร์ที่มีไดรเวอร์ NDIS โปรเซสเซอร์ที่เรียงลำดับใหม่และดำเนินการชุดคำสั่งแบบคาดเดาเพื่อชดเชยการชะลอตัวของความเร็วสัญญาณนาฬิกาที่เกิดจากข้อจำกัดของอุปกรณ์อิเล็กทรอนิกส์เซมิคอนดักเตอร์และความเร็วแสง เครื่องบินและตัวถังรถยนต์ที่ออกแบบด้วยคอมพิวเตอร์ ยาและโครงสร้างดีเอ็นเอ เกมคอมพิวเตอร์ซึ่งมีการเขียนบทความจำนวนเมกะไบต์ที่เต็มไปด้วยอินทิกรัลเฟรสเนลเพื่อแสงจ้าเล็กน้อย ภาพยนตร์และหนังสืออิเล็กทรอนิกส์ อัลกอริธึม NLP และ TreeNet ที่ให้ผลการค้นหาจากฐานข้อมูลขนาดใหญ่ - นี่คือสิ่งที่อยู่รอบตัวเราทุกวัน ต้องขอบคุณโปรแกรมเมอร์ ต้องขอบคุณแนวทางดั้งเดิมและความรู้พื้นฐาน ต้องขอบคุณวิธีการที่รอบคอบและประณีตสำหรับการพัฒนาและจัดการความซับซ้อนของซอฟต์แวร์มานานหลายทศวรรษ

ฉันและคนที่มีความคิดเหมือนกันประสบปัญหาในการสร้างขั้นต่ำตามทฤษฎีสำหรับโปรแกรมเมอร์โดยอิงจากสาขาไอทีที่โดดเด่นที่สุด ซึ่งรวมอยู่ในโปรแกรมของมหาวิทยาลัยทั่วไปด้วยซ้ำ โดยอาศัยการสัมภาษณ์และความรู้ที่เป็นประโยชน์อย่างต่อเนื่องในทางปฏิบัติ บางประเด็นของขั้นต่ำนี้สามารถศึกษาได้ภายใน 5 นาทีบน Wikipedia ในขณะที่บางประเด็นจะต้องทำงานหนักเป็นเวลาหลายเดือน แต่นี่คือสิ่งที่คุณควรรู้อย่างแน่นอนและสิ่งที่คุณควรจะพูดได้อย่างคล่องแคล่ว ยินดีต้อนรับการแก้ไขและการเพิ่มเติมในความคิดเห็น


  1. ซี++, มาตรฐาน, Comeau, 1TBS, Stroustrap/D&E/Josattis/Vanderwood, Dewhurst/Meyers/Sutter, RAII/copy-and-swap/ข้อยกเว้น-ความปลอดภัย, กฎข้อที่ห้า, Alexandrescu/Abrahams-Gurtovoy, การลบประเภท, CRTP, NVI, SFINAE, การค้นหา Koenig, อุปกรณ์ของ Duff, Boost, Sik-Lumsdain/Karlsson, TR บนประสิทธิภาพ C++, การทดสอบ Stepanov, ปัญหาการส่งต่อ/ซีแมนทิกส์การย้าย, SPECS
  2. คอมไพเลอร์คุณลักษณะของการดำเนินการตามมาตรฐาน ข้อจำกัดในการใช้งาน ข้อมูลที่แท้จริง ความแตกต่างระหว่างไลบรารีมาตรฐาน (คอนเทนเนอร์ แรนด์) ABI การใช้งานฟังก์ชันเสมือน การสืบทอดเสมือน ข้อยกเว้น RTTI สวิตช์ ตัวชี้ไปยังฟังก์ชันและวิธีการ การปรับแต่งให้เหมาะสม, การกำจัดการคัดลอก (RVO, NRVO), ขนาดของบนแพลตฟอร์มต่างๆ, คำจำกัดความของคอมไพเลอร์และสภาพแวดล้อม, __declspec, สวิตช์ของคอมไพเลอร์, การปรับให้เหมาะสมฐานว่าง, การลิงก์แบบสแตติกและไดนามิก, การแตกไฟล์, การคอมไพล์แบบกระจาย, ส่วนหัวที่คอมไพล์แล้ว, หน่วยการคอมไพล์เดี่ยว (เข้มงวด) นามแฝง/จำกัด อินไลน์/_forceinline ระเหยได้
  3. มัลติเธรด, นักปรัชญาด้านอาหาร, การหยุดชะงัก/การมีชีวิตอยู่/สภาพการแข่งขัน/ความอดอยาก, ความเป็นอะตอมมิก, คำแนะนำในการล็อคโปรเซสเซอร์, รุ่นหน่วยความจำ/สิ่งกีดขวาง/การสั่งซื้อ, CAS หรือ LL/SC, การรอ/การล็อค/ปราศจากสิ่งกีดขวาง, ปัญหา ABA, การเขียนภาชนะที่ไม่มีการล็อค, การหมุน -ล็อค, ข้อมูล TLS/ต่อเธรด, กฎของอัมดาห์ล, OpenMP, MPI, ลดแผนที่, ส่วนสำคัญ/mutex/เซมาฟอร์/ตัวแปรเงื่อนไข, WaitForSingleObject/WaitForMultipleObjec ts, เธรดสีเขียว/coroutine, pthreads, อนาคต/เลื่อนออกไป/สัญญา, โมเดล นักแสดง
  4. ภาษาแอสเซมบลี, Zubkov/Hyde/Drepper/Kaspersky/Fog/Abrash, x86, FPU/MMX/SSEn/AVX, AT&T และไวยากรณ์ของ Intel, masm32, มาโคร, สแต็ก, ผู้จัดการฮีป/ฮีป, การเรียกแบบแผน, รหัสฐานสิบหก, การแสดงข้อมูลเครื่องจักร , IEEE754 , เอนเดียนน้อย/ใหญ่, SIMD, ข้อยกเว้นด้านฮาร์ดแวร์, การขัดจังหวะ, หน่วยความจำเสมือน, การย้อนกลับ, การหยุดชะงักของสแต็กและฮีป, การเขียนโปรแกรมเชิงส่งคืน, เชลล์โค้ดตัวอักษรและตัวเลข, ข้อผิดพลาด L1/L2/RAM/เพจและการกำหนดเวลา, ภาษาแอสเซมบลี ARM
  5. ฮาร์ดแวร์, Horowitz-Hill/Titze-Schenk/จากฟิสิกส์ถึง C จาก ปัญชุล , เซมิคอนดักเตอร์อิเล็กทรอนิกส์/สปินทรอนิกส์/โฟโตนิกส์, ทรานซิสเตอร์, ทริกเกอร์, การออกแบบวงจร, ไมโครโค้ด, เทคโนโลยีโปรเซสเซอร์, การสังเคราะห์ลอจิก, การวิเคราะห์เวลาแบบคงที่, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino, อุปกรณ์หน่วยความจำ (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, อนุกรมวิธานของ Flynn (ID), แนวทางของ Princeton และ Harvard, สถาปัตยกรรมโปรเซสเซอร์, สถาปัตยกรรม x86, VID/PID
  6. โปรเซสเซอร์, ไปป์ไลน์, ไฮเปอร์เธรดดิ้ง, การดำเนินการนอกคำสั่ง, การดำเนินการเก็งกำไร, การทำนายสาขาแบบคงที่/ไดนามิก, การดึงข้อมูลล่วงหน้า, แคชที่เชื่อมโยงหลายรายการ, สายแคช/แคชที่พลาด, รอบสัญญาณนาฬิกา, วงแหวนป้องกัน, หน่วยความจำในระบบมัลติโปรเซสเซอร์ (SMP/NUMA) , ช่วงเวลาแห่งความทรงจำ
  7. คณิตศาสตร์ไม่ต่อเนื่อง, K2, ทฤษฎีบทของโพสต์, วงจร, ออโตมาตาจำกัด (DKA และ NDKA), ปืนไรเฟิลจู่โจม Kalashnikov, ออโตมาตาเซลลูลาร์
  8. ความสามารถในการคำนวณ, เครื่องจักรทัวริง, อัลกอริธึมปกติของมาร์คอฟ, เครื่องโพสต์, สมการไดโอแฟนไทน์ของ Matiyasevich, ฟังก์ชันแลมบ์ดาของ Church, ฟังก์ชัน Kleene แบบเรียกซ้ำบางส่วน, การเขียนโปรแกรมเชิงผสม Sheinfinkel, Brainfuck, ความเท่าเทียมกันของทัวริงบึง, ปัญหาการหยุดและการนำไปใช้ในตนเอง, การนับชุดของฟังก์ชันคำนวณได้ เครื่อง RAM, อัลกอริธึม Tarski, ตัวแก้ปัญหา SAT/SMT, ทฤษฎีระบบที่เป็นทางการ
  9. ภาษาโปรแกรม, ไวยากรณ์, ลำดับชั้นของ Chomsky, ทฤษฎีบท Myhill-Nerowd, การอัดแทรกบทแทรกและบทแทรกของ Ogden, พีชคณิตของ Kleene, NDKA → DKA, ปัญหาที่ไม่สามารถตัดสินใจได้ในอัลกอริทึมในภาษาทางการ, Dragonbook, Friedl, regexps และความซับซ้อน, PCRE, BNF, Boost.Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, การวิเคราะห์โค้ดแบบคงที่, การคอมไพล์/การคอมไพล์/การคอมไพล์/การถอดรหัสที่สร้างความสับสน, Clang/LLVM/XMLVM/Emscripten, GCCXML, OpenC++, การสร้างเครื่องเสมือน, JiT/AoT/GC, DSL/DSEL
  10. อัลกอริทึมและการเพิ่มประสิทธิภาพเชิงผสมผสาน, Cormen/Skiena/Sedgwick/Knuth/Aho-Hopcroft-Ulman/Papadimitriou/Shriver-Goldberg/Prep Arata-Shamos/e-maxx.ru โครงสร้างข้อมูล อัลกอริธึม ความซับซ้อน สัญลักษณ์ Landau ทฤษฎีบท Akra-Bazzi เวลา-อวกาศ การแลกเปลี่ยน, คลาสความซับซ้อน, ปัญหา NP-สมบูรณ์, KMP, กราฟและทรี, โฟลว์ในเครือข่าย, เมทริกซ์ Kirchhoff, ทรีการค้นหา (โดยเฉพาะ RB-tree และ B-tree), การตรวจจับการบดเคี้ยว, ฮีป, ตารางแฮชและแฮชในอุดมคติ, เครือข่าย Petri อัลกอริธึมชาวนารัสเซีย วิธีคารัตสึบาและการคูณเมทริกซ์วินโนกราด-สตราสเซน การเรียงลำดับ อัลกอริธึมและเมทริกซ์โลภ โปรแกรมไดนามิก โปรแกรมเชิงเส้น อัลกอริธึมดิฟ อัลกอริธึมแบบสุ่มและอัลกอริธึมการค้นหาแบบคลุมเครือ หมายเลขสุ่มเทียม ตรรกะคลุมเครือ
  11. วิธีการเชิงตัวเลข, การแยกขั้ว/วิธีของนิวตัน, อินเตอร์และอนุมาน, เส้นโค้ง, วิธีเกาส์/จาโคบี/ไซเดล, การสลายตัวของ QR และ LU, SVD, วิธีกำลังสองน้อยที่สุด, วิธีรันจ์-คุตตะ, วิธีอดัมส์, สูตรของนิวตัน-โคตส์, วิธีริตซ์, วิธีบับนอฟ-กาเลอร์คิน วิธีการ ผลต่างอันจำกัด/วิธีองค์ประกอบ FFT/STFT การลู่เข้าและความเสถียร
  12. การเรียนรู้ของเครื่อง, Russell-Norvig/Bishop, แนวทางการสร้างแบบจำลอง AI, การฝึกอบรมใหม่/การตรวจสอบความถูกต้องข้าม, เครือข่ายแบบเบย์, เครือข่ายประสาทเทียม, เครือข่าย Kohonen, เครื่องจักร Boltzmann แบบจำกัด, การลงลาดแบบไล่ระดับสี/การปีนเขา, การเพิ่มประสิทธิภาพสุ่ม (วิธีมอนติคาร์โล, วิธีการหลอม, อัลกอริธึมทางพันธุกรรม, อัลกอริธึมมด ), SVM, การเร่งการไล่ระดับสี, การวิเคราะห์คลัสเตอร์, วิธีการองค์ประกอบหลัก, LSH, การเรียนรู้แบบเสริมกำลัง, MDP, การดึงข้อมูล/การทำเหมืองข้อมูล/การประมวลผลภาษาธรรมชาติ, คอมพิวเตอร์วิทัศน์, Szeliski, OpenCV, การประมวลผลภาพ, OCR, ตัวกรอง Sobel, Haar cascade , กรอบงานไวโอลิน-โจนส์, SURF, จิตวิทยาสรีรวิทยาเบื้องต้นของการมองเห็น, IPython/pandas/scikit-learn
  13. ทฤษฎีสารสนเทศ, การบีบอัด, Huffman, RLE, BWT, LZ, รหัสแก้ไขข้อผิดพลาด, การบีบอัดแบบสูญเสีย (รูปภาพ, เสียง, วิดีโอ), เอนโทรปีข้อมูล, สูตรของแชนนอน, ความซับซ้อนของ Kolmogorov
  14. การเข้ารหัส, Schneier/Yashchenko, หลักการ Kerkhoffs, สมมาตร (DES, AES), ไม่สมมาตร (RSA), คุณภาพ PRNG, อัลกอริธึม Diffie-Hellman, เส้นโค้งรูปไข่, การแฮช (MD5, SHA, CRCn), DHT, ความแรงของการเข้ารหัส, การโจมตีแบบเข้ารหัส (ปรมาจารย์ การโจมตี), WEP/WPA/WPA2 และการโจมตี, ลายเซ็นดิจิทัลและใบรับรอง, PKI, HTTPS/SSL, การพิสูจน์ความรู้เป็นศูนย์, รูปแบบเกณฑ์
  15. คณิตศาสตร์, คนุต-เกรแฮม-ปาตาชนิก/โซริช/วินเบิร์ก, สปิวัค/ดัมมิท-ฟุท, มาแทน, ลินัล, คอมแพลน, ฟังคาน, ดิฟเจม, ทฤษฎีจำนวน, ดิเฟอร์ส/อินทัวร์/urchpa/แคลคูลัสของการแปรผัน/การควบคุมที่เหมาะสม, ฟังก์ชันการสร้าง, อนุกรม, เชิงผสม ทฤษฎี /matstat/sloop/ทฤษฎีการเข้าคิว, โซ่มาร์คอฟ, การแปลงอินทิกรัล (ฟูริเยร์, ลาปลาซ, เวฟเล็ต), NZQRCHOS, แพ็คเกจทางคณิตศาสตร์ (Mathematica, Maple)
  16. ฟิสิกส์กฎของเคอร์ชอฟฟ์ กฎจูล-เลนซ์ ความต้านทานเชิงซ้อน ความเร็วและความถี่ของแสง สมการของแมกซ์เวลล์ ลากรองจ์และแฮมิลตัน
  17. เคมี, ปริมาณสารสัมพันธ์, เคมีซิลิคอน :)
  18. สถาปัตยกรรมและสไตล์โค้ด, McConnell/Fowler/Leblanc/Gamma/Alexandre Rescu-Sutter/Butch, การเขียนโปรแกรมป้องกัน, รูปแบบ, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, เมตริกโค้ด
  19. วิธีการพัฒนา, Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE
  20. การทดสอบ, การทดสอบหน่วย, การทำงาน, โหลด, การทดสอบการรวม, การทดสอบ UI
  21. เครื่องมือพัฒนา, IDE, IntelliSense, ดีบักเกอร์ (VS/Olly/WinDbg/kdb/gdb) และตัวติดตาม (strace/ltrace), รูปแบบข้อมูลดีบัก DWARF, ตัวถอดประกอบและตัวถอดรหัส (IDA/HexRays/Reflector), ระบบควบคุมเวอร์ชัน (SVN, GIT) ผสาน/สาขา/ลำตัว ระบบการตั้งชื่อไฟล์และสาขา การบูรณาการอย่างต่อเนื่อง ant การครอบคลุมโค้ด การวิเคราะห์แบบคงที่ (lint, cppcheck) การวิเคราะห์แบบไดนามิก (valgrind, fuzzing) การตรวจสอบและการตรวจสอบความถูกต้องของซอฟต์แวร์ (Frama-C, RAISE (RSL) Coq), การทำโปรไฟล์, ตัวติดตามจุดบกพร่อง, เอกสารโค้ด, ระบบบิลด์ (CMake), ตัวจัดการแพ็คเกจ (NuGet)
  22. กรอบงาน, Qt, moc และ meta-information, แนวคิด slot-signal, Summerfield-Blanchette/Schlee, PoCo, ห้องสมุดอุตสาหกรรม: GMP, i18n, lapack, fftw, pcre
  23. ระบบปฏิบัติการ, Silberschatz/Richter/Solomon-Russinovich/R obachevsky/Vakhalia/Stevens/Love/Linux Kernel Internals, ตัวจัดการหน่วยความจำ, ตัวจัดการฮีปและอุปกรณ์ (LAL/LFH/สแล็บ), ตัวจัดการอุปกรณ์, ตัวจัดการกระบวนการ, การสลับบริบท, จริงและได้รับการป้องกัน โหมด, ไฟล์ปฏิบัติการ (PE/ELF/Mach), อ็อบเจ็กต์เคอร์เนล, กลไกการดีบัก (strace/ptrace/dtrace/pydbg, Debug API) และ minidumps, bash, สแต็กเครือข่ายและเซิร์ฟเวอร์ประสิทธิภาพสูง, netgraph, CR0, IPC, ระบบย่อย windowing, ความปลอดภัยของระบบ: ACE/ACL และสิทธิ์การเข้าถึง, เทคโนโลยีการจำลองเสมือน, RTOS (QNX), การเขียนโปรแกรมไดรเวอร์, IRQL, IRP, ระบบไฟล์, BigTable, ไดรเวอร์ NDIS/มินิพอร์ต/FS/ไดรเวอร์ตัวกรอง, Mm-, Io-, ฟังก์ชัน Ldr, DKOM และรูทคิท, GDT/IDT/SDT, เคอร์เนล Windows/Linux/BSD, POSIX
  24. โมเดลตามส่วนประกอบ, Rogerson/Tavares, COM/OLE/ActiveX/COM+/DCOM RPC, ATL, อพาร์ทเมนท์, ชื่อเล่น, MIDL, XPCOM, CORBA, TAO, D-Bus
  25. สุทธิ, Stevens, โมเดล OSI/โมเดลอินเทอร์เน็ต, อีเธอร์เน็ต, TCP/IP, หน้าต่าง TCP, อัลกอริธึม Nagle, ซ็อกเก็ต, บัฟเฟอร์โปรโตคอล/Thrift/Avro/ASN.1, AMQP, ICMP, การกำหนดเส้นทาง/BGP/OSPF, ARP, การโจมตี Mitnik, syn ฟลัด, HTTP/FTP, P2P/DHT, DHCP, SMB/NBNS, IRC/XMPP, POP3/SMTP/ESMTP/IMAP, DNS, WiFi/WiMax/GSM/CDMA/EDGE/บลูทูธ/GPS, ACE, Wireshark
  26. กราฟิกและ GPGPU, อัลกอริธึม Bresenham, โมเดลสี, ray tracing และกราฟิกหลายเหลี่ยม, OpenGL/GLSL/Open Inventor, DirectX/DirectShow/DirectAudio/HLSL, สเตนซิล/ความลึก/การทดสอบอัลฟา, ไปป์ไลน์กราฟิกใน DirectX 11, เชเดอร์, โมเดลแสง (Phong), แบนด์วิธ, อัตราเติม, OpenCL/CUDA/AMP, ทิวทัศน์, พื้นที่, เงา, การแรเงาแบบเลื่อน, การสร้างพื้นผิวและการกรอง, การลดรอยหยัก, HDR, การทำแผนที่โทน, ความเป็นจริงเสมือน/เสริม
  27. รูปแบบ, XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON/bencode, YAML, JPEG/PNG/WebP, AVI/MPEG/RIFF/WAV/MP3/OGG/WebM, SVG, Unicode, การเข้ารหัส ไบต์เดี่ยว/UTF-8/UTF-16/UCS-2/UTF-32 ปัญหาด้านความยาวและการเปรียบเทียบสตริง Unicode
  28. ฐานข้อมูล, Gruber/Date, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, ขั้นตอนการจัดเก็บ, ทริกเกอร์, พีชคณิต Codd/A, บทช่วยสอน D, รูปแบบปกติ, การเพิ่มประสิทธิภาพและการดำเนินการสืบค้น, โครงสร้างข้อมูล ดัชนี, ธุรกรรมและกรด, ทฤษฎีบท Brewer's CAP, NoSQL, พื้นที่จัดเก็บคีย์-ค่า, การแบ่งส่วน, ORM (C++ ODB), ERD, OLAP, semantic web, triplestore, RDF/Turtle, SPARQL, OWL, Semanticscience Integrated Ontology, เหตุผล, DBpedia
  29. การเขียนโปรแกรมประยุกต์, C#/F#, Shildt/Troelsen/Richter, Generics, Yield, linq/plinq, การสะท้อนกลับ, AST, WCF, WinForms/WPF/Silverlight, AOP, กรอบงานการบันทึก, .NET Assembly, Scala, Horstmann/Odersky, การจับคู่รูปแบบ, มาโคร /กึ่งคำพูด
  30. การคำนวณควอนตัม, อัลกอริธึมของ Shor, การเข้ารหัสควอนตัม
  31. การเขียนโปรแกรมเชิงฟังก์ชัน, Haskell/Ocaml/Scheme/Alice หรือ Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Harrison-Field, HOF (แผนที่/พับ/ตัวกรอง), ระบบประเภท Hindley-Milner, monads, typeclasses, ADT, ประเภทที่ต้องพึ่งพา, ขี้เกียจ/มีพลัง, การเขียนโปรแกรมลอจิก (Prolog หรือ Mercury), การเขียนโปรแกรมแบบแข่งขัน (Erlang หรือ Oz)
  32. การเขียนโปรแกรมเว็บและภาษาสคริปต์, หลักสูตรการรับรอง PHP5 ของ Flanagan/Zend + คู่มือการศึกษา, Apache/nginx, CGI/FastCGI, PHP/Zend Framework/ReactPHP/Zend Engine/Doctrine หรือ Propel/CodeIgniter หรือ Symphony หรือ Yii, Python/Django/Twisted, Ruby/RoR, ASP .NET MVC, JavaScript/jQuery/React/Google ปิด/ExtJS/node.js, OOP ใน JavaScript, HTML5, CSS3/เค้าโครงตารางและบล็อก, RSS, canvas/WebGL, Ajax/WebSockets, ปัญหาด้านความปลอดภัย (XSS, SQLjection, CSRF), โหลดสูง, ปัญหา C10k, SWIG
  33. การออกแบบ GUI และการนำเสนอข้อมูล, Raskin/Tufty, การใช้งาน, พื้นฐานของการออกแบบและการพิมพ์, กฎของ Fitts, พื้นฐานของเค้าโครง, LaTeX

อัปเดต:ความคิดเห็นบางรายการเกิดขึ้นซ้ำๆ บ่อยครั้ง และควรพยายามตอบความคิดเห็นเหล่านั้นในการอัปเดตโพสต์


ทฤษฎีนี้ค่อนข้างถูกวิพากษ์วิจารณ์อย่างถูกต้อง ขาดการนำเสนออย่างเป็นระบบและพื้นที่ใกล้เคียง SUDDEN ของหัวข้อที่แตกต่างกันทั้งในเชิงลึกและในเนื้อหา นี่ไม่ใช่จุดบกพร่อง นี่คือคุณลักษณะ การนำเสนอโปรแกรมอย่างเป็นระบบในเกือบทุกจุดจะใช้พื้นที่ไม่น้อยไปกว่าสารบัญของ Talmuds ตัวอวบ ดังนั้นจึงเป็นการดีกว่าที่จะตั้งชื่อ Talmuds เหล่านี้ แล้วจะทำงานกับรายการนี้ได้อย่างไร? คุณควรนำหนังสือดีๆ ในหัวข้อนี้มาอ่านจนกว่าจะพบคำที่กล่าวถึงทั้งหมดในระหว่างขั้นตอนการอ่าน ผู้เขียนไม่สามารถจินตนาการได้ในความฝันที่แปลกประหลาดที่สุดว่ามีคนตัดสินใจว่าอุปกรณ์ของดัฟฟ์จะได้รับการพิจารณาในเชิงลึกและปริมาณให้มีค่าเท่ากับมาตรฐานศักดิ์สิทธิ์หนึ่งพันหน้า อย่างไรก็ตาม เกณฑ์นี้ค่อนข้างได้ผล - คุณสามารถอ่านหนังสือเกี่ยวกับ C++ สำหรับผู้เริ่มต้นได้นับร้อยเล่ม และไม่เคยมีใครพูดถึงมันเลย แต่ถ้าคุณอ่านหนังสือและบทความที่มีประโยชน์จริงๆ (สำหรับหัวข้อเช่น C++ หนังสือดังกล่าวมีอยู่และอยู่ในรายการ) แล้วทุกคำก็ค่อนข้างจะตอบสนองอย่างรวดเร็ว จุดประสงค์ของโปรแกรมเนื่องจากขนาดของมันคือการให้โอกาสในการประเมินว่ามีการอ่านหนังสือในหัวข้อนี้ในจำนวนที่เพียงพอหรือไม่

Theormin ยังเผชิญกับคำวิพากษ์วิจารณ์จำนวนมากจากผู้ที่คิดว่าตนเองเป็นโปรแกรมเมอร์ซึ่งเชื่อเช่นนั้น เป็นไปไม่ได้ที่จะรู้ทั้งหมดนี้ใช้เวลาศึกษานานเกินไป และในทางปฏิบัติแคบเชิงนามธรรมบางแบบส่วนใหญ่จะไม่ได้ใช้ น่าเสียดายที่คนเหล่านี้ไม่เข้าใจความแตกต่างระหว่างความรู้/ความจำและความรู้ ค่าสำหรับโปรแกรมเมอร์ไม่ได้จดจำรูปแบบที่แน่นอนของแพ็คเกจ NBNS ใด ๆ แต่เป็นการเรียนรู้แนวทางที่ใช้ระหว่างการพัฒนา กล่าวอีกนัยหนึ่ง ไม่ใช่ความสามารถในการทำซ้ำ แต่เป็นความสามารถในการสร้างใหม่หรือระบุ รวมถึงในพื้นที่อื่น . เป็นความสามารถของบุคคลในการวิเคราะห์และสังเคราะห์ (ซึ่งไม่ได้มาจากที่ไหนเลย แต่ทำได้ผ่านงานการรับรู้ที่กระตือรือร้น) ที่ทำให้เขาแตกต่างจาก Google ซึ่งแม้ในอนาคตอันไกลโพ้นจะไม่เรียนรู้ที่จะแก้ปัญหาแม้แต่ div2 250 . การพัฒนาความสามารถนี้มีเป้าหมายขั้นต่ำทางทฤษฎีซึ่งในกระบวนการทำงานจะต้องเสริมด้วยความรู้เฉพาะโดเมนอย่างแน่นอนไม่ว่าจะเป็นคุณสมบัติของฟิสิกส์ของเกมการพัฒนาตัวถูกดำเนินการใน Java หรือการสร้างไมโครวงจรจริง

ในย่อหน้าที่แยกต่างหาก เป็นเรื่องที่ควรค่าแก่การเน้นคำถามจากผู้ที่สงสัยความสามารถในการเชี่ยวชาญทฤษฎีหรือเชื่อว่าความสามารถในการนำไปใช้จะไม่ค่อยเป็นที่ต้องการและจะอ่อนแอลง โดยทั่วไป คะแนนขั้นต่ำทางทฤษฎีในคะแนนส่วนใหญ่ค่อนข้างด้อยกว่าหลักสูตรของแผนก CS ของมหาวิทยาลัยปกติ ดังนั้นจึงค่อนข้างเป็นไปได้ที่จะเชี่ยวชาญหลักสูตรนี้ใน 5 ปี แม้ว่าจะรวมเข้ากับงานก็ตาม โดยเฉพาะอย่างยิ่งในการพัฒนาเกมมีการใช้คะแนนที่ระบุไว้ตั้งแต่ 1/3 ถึง 2/3 ของรายการ (ตามการประมาณการต่างๆในการสนทนา) กิจกรรมที่ขาดหายไปสามารถเติมเต็มได้ เช่น โดยการปรึกษาผู้อื่นเกี่ยวกับ Stack Overflow

แยกประเภทของบุคคลที่พูดในรูปแบบของ "ฉันไม่รู้ ฉันห้ามสิ่งนั้น" คือผู้ที่เชื่อว่าเป้าหมายของโปรแกรมเมอร์ไม่ใช่การปรับปรุงโลก แต่เพื่อ หาเงิน. พวกเขาไม่ต้องการขั้นต่ำตามทฤษฎีนี้จริงๆ แต่ควรมองหาบทเรียนเกี่ยวกับวิธีการขโมย หลอกลวง และบังคับให้ผู้อื่นทำงานแทนอย่างถูกต้องและมีความรู้ในความซับซ้อนทั้งหมด

“พวกมันก็เลี้ยงเราอย่างดีที่นี่เหมือนกัน”. ข้อโต้แย้งนี้เป็นไปตามข้อพิสูจน์ในการอภิปรายที่มีการใช้งานมากเป็นอันดับสองของบทความ metaclass:
ทุกสิ่งที่โปรแกรมเมอร์ควรรู้เพื่อที่ว่าหลังจาก 40 ปีเขาจะไม่ถูกทิ้งลงกองขยะที่มีคนจรจัดอยู่
อันที่จริง เมื่ออายุประมาณ 45 ปี ความเสื่อมของสมองเริ่มแสดงออกมาอย่างแข็งขัน นำไปสู่ปัญหาสำคัญในการทำความเข้าใจและความสามารถในการใช้งานโค้ดที่มีความซับซ้อนของไซโคลมาติกตามปกติ การสูญเสียความสามารถในการเขียนโค้ด บวกกับการไร้ความสามารถเนื่องจากขาดการฝึกอบรมด้านการวิเคราะห์/การสังเคราะห์ ถือเป็นเส้นทางที่รับประกันได้ บางคนยังคงรักษาความสามารถในการดำเนินการด้วยความซับซ้อนของไซโคลมาติกตามปกติในวัยชรา แต่เพียงเพราะประสิทธิภาพที่สูงกว่าปกติในเยาวชนเท่านั้น คุณสามารถตรวจสอบว่าคุณมีความเสี่ยงหรือไม่บน TopCoder
จากฟิสิกส์สู่การเขียนโปรแกรม
ทำไมคุณต้องรู้เรื่องระดับต่ำทุกประเภท?

และสุดท้ายทฤษฎีนี้มาจากไหน:
หลักสูตรวิทยาศาสตร์คอมพิวเตอร์ ACM

บทความนี้ไม่ใช่บทช่วยสอนการเขียนโค้ด และไม่ใช่โพสต์เกี่ยวกับ “ภาษาโปรแกรมที่จะเลือก” หากคุณต้องการเข้าใจว่าคุณสนใจที่จะเรียนรู้เกี่ยวกับโลกแห่งโค้ดมากแค่ไหน คำถามที่สำคัญกว่านั้นก็คือ การเขียนโปรแกรมคืออะไร การเขียนโปรแกรมจากภายในมีลักษณะอย่างไร? ฉันและการเขียนโปรแกรมเข้ากันได้หรือไม่?

หลักการของ “ตรรกะ ไม่ใช่คณิตศาสตร์”

หนึ่งในความเข้าใจผิดที่ใหญ่ที่สุดที่โปรแกรมเมอร์หน้าใหม่มีก็คือการเขียนโปรแกรมนั้นเต็มไปด้วยคณิตศาสตร์ หากคุณคิดว่าการเขียนโปรแกรมจะทำให้คุณจำความรู้ในวิชาตรีโกณมิติ พีชคณิต ฯลฯ ในโรงเรียนได้ แสดงว่าคุณคิดผิด คณิตศาสตร์ประเภทนี้หาได้ยากในการเขียนโปรแกรม

จากประสบการณ์ สิ่งที่ "เป็นคณิตศาสตร์ล้วนๆ" ได้แก่ ลำดับการดำเนินการในนิพจน์และระบบพิกัด ไม่มีอะไรซับซ้อนเกินไป ในทางตรงกันข้าม มีเหตุผลมากมาย ความจำเป็นในการคิดล่วงหน้า ทำความเข้าใจลำดับสิ่งที่ต้องทำ และวิธีควบคุมโฟลว์นั้น แทรกซึมอยู่ในทุกแง่มุมของการเขียนโปรแกรม หากคุณมีความสามารถพิเศษด้านตรรกะ คุณจะเริ่มรับมือกับงานเขียนโปรแกรมได้ง่าย

หลักการ “จับดาวตก”

การเขียนโปรแกรมสามารถมองได้ว่าเป็นการรัน "กระบวนการ" หลายอย่าง เสมือนเป็นการบังคับให้คอมพิวเตอร์ "ทำงานแทนคุณ" และจัดการกระบวนการเหล่านั้น ในการเขียนโปรแกรม กระบวนการมักจะให้ผลลัพธ์ ผลลัพธ์อาจเป็นไฟล์ก็ได้ แต่ก็อาจเป็นอะไรที่ง่ายกว่านั้นก็ได้ เช่น สตริงหรือตัวเลข

ปัญหาในการทำงานกับกระบวนการต่างๆ ก็คือ ถ้าคุณไม่ทำอะไรกับผลลัพธ์ของมัน มันก็จะสลายไป พูดตามตัวอักษรแล้ว พวกเขา "ไปสู่การลืมเลือน" ไม่เคยถูกสร้างขึ้นมาใหม่ คล้ายกับดวงดาวที่เปล่งประกายบนท้องฟ้าและหายไป กล่าวอีกนัยหนึ่งคุณต้อง "จับพวกมัน"

หากคุณสร้างบางสิ่งด้วยกระบวนการ คุณจะต้องคว้ามันไว้ ไม่เช่นนั้นคุณจะสูญเสียมันไป นี่คือจุดที่ตัวแปรเข้ามามีบทบาท - เป็นวิธี "บันทึก" ผลลัพธ์ของกระบวนการ หลักการนี้ช่วยให้เข้าใจได้อย่างมากว่าการเขียนโปรแกรมคืออะไรในช่วงเริ่มต้นของการเรียนรู้ และถ้าจับได้เร็วจะพบว่ามีประโยชน์มาก

หลักการ "พจนานุกรม"

มี "ประเภท" มากมายในการเขียนโปรแกรม คิดว่าประเภทเป็นองค์ประกอบสำคัญของภาษาการเขียนโปรแกรม ประเภทหนึ่งคือสตริงหรือชุดอักขระภายในเครื่องหมายคำพูด ทั้ง "apple" และ "orange" เป็นสตริง ตัวอย่างเช่นสามารถนำมารวมกันและทำเป็น "แอปเปิ้ลส้ม" ตัวเลขเป็นประเภทที่แตกต่างกัน ตัวเลขสามารถบวก ลบ คูณได้ (นอกเหนือจากการดำเนินการอื่นๆ) จากนั้นก็มี "อาร์เรย์" - ชุดของวัตถุในลำดับที่แน่นอน ["First", "goes", "before", "second"] เช่น เป็นอาร์เรย์ที่มีองค์ประกอบแรก "First" และองค์ประกอบสุดท้าย "second"

แต่บางทีประเภทที่ทรงพลังที่สุดประเภทหนึ่งอาจเป็นคู่แฮชหรือคีย์-ค่า แฮชมีหลายชื่อ ใน Ruby นี่คือ "แฮช" ใน JavaScript เรียกว่า "วัตถุ" บางที Python ตั้งชื่อที่ดีกว่า: "พจนานุกรม" หากคุณคิดสักนิด พจนานุกรมคือชุดของคีย์ (คำ) ที่แสดงความหมาย

แต่ทำไมเรื่องนี้ถึงสำคัญ? ปรากฎว่ามักจำเป็นต้องใช้โครงสร้างดังกล่าวในการจัดเก็บข้อมูล ตัวอย่างเช่น คุณสามารถจัดแพ็คเกจข้อมูลเกี่ยวกับบุคคลได้ดังนี้:

("first_name" => "โจนาธาน", "last_name" => "ริชาร์ด", "สัญชาติ" => "อังกฤษ" )

มีคีย์ "first_name" (ชื่อ), "last_name" (นามสกุล) ฯลฯ สิ่งเหล่านี้เปรียบเสมือนคุณสมบัติหรือคุณลักษณะของบุคคล คุณยังสามารถเพิ่ม "สีผม" (สีผม), "อายุ" (อายุ) หรือ "เพศ" (เพศ) ได้ด้วย และแต่ละคีย์เหล่านี้ก็มีความหมาย ส่วนสำคัญของการเขียนโปรแกรมเกี่ยวข้องกับการกำหนดรูปแบบของโครงสร้างข้อมูล และคู่คีย์-ค่ากำลังกลายเป็นอาวุธที่มีค่าที่สุดในคลังแสงของคุณ ดังนั้นจึงมีประโยชน์ที่จะทำความเข้าใจวิธีการทำงานให้เร็วที่สุดเท่าที่จะเป็นไปได้

หลักการ "matryoshka"

การเขียนโปรแกรมเต็มไปด้วยวัตถุที่อยู่ภายในวัตถุภายในวัตถุอื่น เมื่อเขียนโปรแกรม คุณมักจะพบว่าตัวเองกำลังพยายามจัดโครงสร้างข้อมูล และบ่อยครั้งที่โครงสร้างเหล่านั้นมีโครงสร้างอื่นๆ อยู่ภายใน

มาเพิ่มคุณสมบัติ “พี่น้อง” ให้กับตัวอย่างก่อนหน้านี้:

("first_name" => "Jonathan", "last_name" => "Richards", "nationality" => "British", "siblings" => ( "brothers" => , "sisters" => ["Fiona", "แมรี่"] ) )

คุณจะเห็นหลักการนี้ตลอดการเขียนโปรแกรมของคุณ ใน HTML องค์ประกอบบางอย่างประกอบด้วยองค์ประกอบอื่น ๆ :

ในการคำนวณ วัตถุส่วนใหญ่เป็นโปรแกรมหรือไฟล์ นี่เป็นหลักการที่มีประโยชน์อย่างยิ่ง ในการเขียนโปรแกรม คุณมักจะได้ยินคำว่า "เข้า" และ "ออก" - อินพุตและเอาต์พุต เหตุผลก็คืองานมักจะรับอินพุต (อินพุต) ประมวลผล (ประมวลผล) และทำการเปลี่ยนแปลง (เอาท์พุต) การประมวลผลเสร็จสิ้นโดยกระบวนการ (บิตที่ใช้งานอยู่) ซึ่งควบคุมโดยโค้ดของคุณ บิตแบบพาสซีฟคือข้อมูลที่กระบวนการดำเนินการ มันเหมือนกับการเปลี่ยนเนื้อสับเป็นไส้กรอก

หลักการ "สุนัข แมว และปลา"

(หรือหลักเหตุและผล)

ลองจินตนาการว่าคุณมีห้องหนึ่ง ในห้องนี้มีแมวและปลาอยู่ในชาม ปลาก็มีพฤติกรรมตามปกติ ในช่วงเวลาหนึ่ง มี 2 สิ่งเกิดขึ้น สุนัขเข้าห้อง และแมวออกจากห้อง ในเวลาเดียวกันปลาก็เริ่มร้องเพลง คำถาม: อะไรทำให้ปลาร้องเพลง?

มีความเป็นไปได้มากมายให้พิจารณา เราสรุปได้ว่าเหตุการณ์นี้เกิดขึ้นเพราะมีสุนัขเข้ามา และเราสามารถสรุปได้ว่าสาเหตุก็คือแมวออกมา หรือบางทีสาเหตุอาจเป็นเพราะทั้งสองเหตุการณ์รวมกัน บางทีเหตุการณ์ทั้งสองอาจไม่เกี่ยวข้องกัน แต่ความจริงก็คือ 18:17 เป็นเวลาที่ปลากลายเป็นแม่มด บางทีปลาทุกตัวก็ร้องเพลง ตัวเลือกบางอย่างเหล่านี้อาจเป็นจริง

สิ่งที่สำคัญมากสำหรับโปรแกรมเมอร์คือการสามารถแยกสาเหตุของการเปลี่ยนแปลงได้ คุณจะพบกับสถานการณ์เช่นนี้ตราบใดที่คุณเขียนโค้ด ในสถานการณ์เช่นนี้ เราอาจต้องการถามตัวเองว่า เราสามารถจำลองสุนัขเข้ามาโดยไม่ต้องมีแมวออกมาได้ไหม (ซึ่งอาจมีความชัดเจนมาก) เราสามารถจำลองแมวออกไปโดยไม่มีสุนัขเข้าไปได้หรือไม่ เราจะจำลองสภาพแวดล้อมได้อย่างสมบูรณ์หรือไม่ (เช่น เวลา 18:17 น.) เพื่อดูว่ามันส่งผลต่อเสียงร้องของปลา โดยไม่ขึ้นอยู่กับสุนัขและแมวหรือไม่ และอื่นๆ สิ่งสำคัญคือต้องใช้วิธีการเพื่อระบุสาเหตุของการเปลี่ยนแปลง ความสามารถนี้จะช่วยคุณซ้ำแล้วซ้ำอีกตราบใดที่คุณเขียนโค้ด

นามธรรมหรือหลักการ "พิซซ่า"

นี่เป็นหนึ่งในหลักการที่ยุ่งยากที่สุด ลองนึกภาพร้านพิซซ่า ทุกวันพ่อครัวจะเตรียมพิซซ่าพร้อมท็อปปิ้งที่แตกต่างกัน พิซซ่าแต่ละชิ้นถูกจัดเตรียมตามลำดับที่แน่นอน ขั้นแรกให้คุณเตรียมแป้ง จากนั้นจึงปล่อยทิ้งไว้ จากนั้นจึงใส่ลงในกระทะ ใส่ซอสมะเขือเทศ ท็อปปิ้ง ชีส และสุดท้ายก็อบ

แต่โดยธรรมชาติแล้ว พ่อครัวไม่ได้เตรียมพิซซ่าตั้งแต่เริ่มต้นตามลำดับที่อธิบายไว้ที่นี่ คงต้องใช้เวลาหลายปี แต่เขาเตรียมทุกอย่างไว้ล่วงหน้า และเมื่อพูดถึง Neapolitan สิ่งที่คุณต้องทำก็แค่เอาฐาน (ซึ่งปั้นไว้แล้ว) ใส่ซอสมะเขือเทศ แอนโชวี และชีส จากนั้นจึงอบในเตาอบ

สิ่งสำคัญที่ต้องทำความเข้าใจคือ พ่อครัวเพียงต้องรู้ส่วนผสมสำหรับพิซซ่าแต่ละชนิดเท่านั้น มิฉะนั้น พิซซ่าทั้งหมดจะคล้ายกัน การเขียนโปรแกรมดูคล้ายกันมาก คุณใช้ "นามธรรม" เพื่อจัดเก็บข้อมูลทั่วไปมากขึ้น (เช่นเปลือกพิซซ่า) ในขณะที่แยกออกจากข้อมูลที่เฉพาะเจาะจงมากขึ้น (ท็อปปิ้ง)

มาเปลี่ยนการทำพิซซ่าให้เป็นโค้ดกัน ขั้นแรกเรามาเริ่มทำผิดกันก่อน มาสร้างวิธีการ make_a_napoletana_pizza (ทำพิซซ่า Neapolitana):

Make_a_napoletana_พิซซ่า

โดยจะมี 5 ขั้นตอน (ทำฐาน ใส่ซอสมะเขือเทศ ใส่แอนโชวี่ ใส่ชีส อบ):

Make_the_base add_the_tomato_sauce add_anchovy add_cheese อบ

ยอดเยี่ยม. แต่ถ้าเราอยากทำพิซซ่าซาลามิล่ะ? เราจะถูกบังคับให้เขียนวิธีการใหม่ make_a_salami_pizza (ทำพิซซ่าซาลามิ) ซึ่งจะมีลักษณะเหมือนกันมากกับวิธีการปัจจุบัน ยกเว้นว่าจะเพิ่มซาลามิแทนปลากะตัก ราคานี้ค่อนข้างแพง แนวทางของโปรแกรมเมอร์คือการ "สรุป" ส่วนทั่วไปของเทคนิคการทำพิซซ่าและอธิบายส่วนผสมเฉพาะที่แตกต่างกัน เราสามารถทำได้โดยใช้ "อาร์กิวเมนต์" ที่ "ส่งผ่าน" ไปยังเมธอด

นั่นคือสิ่งที่มันหมายถึง สมมติว่าเมธอด make_a_pizza ของเราถูกเรียกด้วยอาร์กิวเมนต์ "toppings" วิธีการจะมีลักษณะดังนี้:

Make_a_pizza(ท็อปปิ้ง)

และมันจะทำงานดังนี้:

Make_the_base add_the_tomato_sauce add_toppings(ท็อปปิ้ง) add_cheese bake

ในบรรทัดที่ 3 เราใช้ท็อปปิ้งที่กำหนดไว้ก่อนหน้านี้และเพิ่มลงในพิซซ่า

ตอนนี้เราได้กำหนดวิธีการทั่วไปในการทำพิซซ่าแล้ว เราก็เรียกมันว่าและระบุส่วนผสมที่เราต้องการได้เลย ทุกอย่างเกิดขึ้นโดยอัตโนมัติ กล่าวอีกนัยหนึ่ง เราเรียกว่า make_pizza(ซาลามิ) และเมื่อวิธีการทำงาน ซาลามิจะกลายเป็นท็อปปิ้งและจะถูกเพิ่มลงในพิซซ่าเมื่อวิธีการไปถึงบรรทัดที่ 3 เพียงเปลี่ยนท็อปปิ้ง คุณก็สามารถสร้างพิซซ่าได้ 2 แบบด้วยวิธีเดียว ประหยัดพอๆ กับที่พนักงานเสิร์ฟเพียงเขียนว่า "ซาลามิ 1 ชิ้น มังสวิรัติ 1 ชิ้น" ลงในแบบฟอร์มสั่งอาหาร แล้วพ่อครัวก็รู้ทุกสิ่งที่เขาต้องการ ในการเขียนโปรแกรมสิ่งนี้เรียกว่า "นามธรรม"

คุณได้มาแล้ว: หลักการเจ็ดประการที่โดยทั่วไปจะเรียนรู้ในช่วง 3 ปีแรกของการเขียนโปรแกรม และมีส่วนสำคัญในการทำความเข้าใจศิลปะของการเขียนโค้ด หากคุณกำลังเริ่มต้นการเดินทาง หลักการเหล่านี้สามารถช่วยคุณได้เช่นกัน

จะเป็นโปรแกรมเมอร์ได้อย่างไร? คุณต้องเรียนรู้อะไรบ้าง? คำตอบดูเหมือนง่าย: ไปที่มหาวิทยาลัยแล้วพวกเขาจะสอนคุณที่นั่น แต่ถ้าคุณถามโปรแกรมเมอร์คนไหนเขาจะบอกว่าสิ่งที่พวกเขาสอนที่นั่นแม้ว่าบางครั้งมันอาจจะน่าสนใจ แต่ก็แทบไม่มีประโยชน์และแทบไม่มีอะไรเหมือนกันกับงานจริงเลย

การเขียนโปรแกรมก็เหมือนกับการรู้หนังสือ

อาชีพของเราเป็นหนึ่งในอาชีพที่ยากที่สุด แต่สิ่งที่สนุกที่สุดคืออาชีพนี้ค่อนข้างเรียบง่าย มีการศึกษาอย่างสงบที่โรงเรียนด้วยซ้ำ ในการเขียนโปรแกรมอย่างง่ายในภาษา Pascal นักเรียนเพียงต้องรู้เกี่ยวกับตัวดำเนินการ 10 ตัว (มีเพียง 15 ตัวเท่านั้น) และฟังก์ชันอินพุต/เอาท์พุต คณิตศาสตร์ และสตริงหลายตัว

ตัวดำเนินการเหล่านี้เหมือนกับตัวอักษรและฟังก์ชันอินพุต/เอาท์พุต อ่าน () และ เขียน () ก็เหมือนกับคำแรก "แม่" และ "พ่อ" ซึ่งเด็ก ๆ เริ่มเข้าใจโลก

อย่างไรก็ตาม เช่นเดียวกับคนทั่วไปที่สามารถอ่านและเขียนบางสิ่งบางอย่างได้ และมีนักเขียนมืออาชีพที่เชี่ยวชาญการใช้ปากกา ทุกวันนี้ก็มีผู้ใช้คอมพิวเตอร์และมีโปรแกรมเมอร์ ในความคิดของฉัน การเป็นโปรแกรมเมอร์นั้นยากกว่านักเขียนมาก เรามีกำหนดเวลาที่จำกัดอยู่เสมอ เราต้องคำนึงถึงความต้องการของผู้ใช้ตามอำเภอใจและเอาชนะความสามารถที่จำกัดของคอมพิวเตอร์ที่ช้า เราต้องทำให้อินเทอร์เฟซเรียบง่ายและสะดวกที่สุดเท่าที่จะเป็นไปได้ จัดทำเอกสารทุกอย่างอย่างดีเพื่อให้ผู้ใช้ไม่หลงทาง และพยายามทำทุกอย่างให้เสร็จสิ้นโดยไม่มีข้อผิดพลาด และคิดล่วงหน้าว่าโปรแกรมจะพัฒนาไปอย่างไรในอนาคต และตรวจสอบให้แน่ใจว่าสามารถเพิ่มฟังก์ชันใหม่ ๆ ได้อย่างง่ายดาย และเป็นที่เข้าใจและคาดการณ์ได้ ในเวลาเดียวกันตัวโปรแกรมจะต้องเขียนในลักษณะเดียวกันเพื่อให้โปรแกรมเมอร์คนอื่นสามารถคิดออกหลังจากคุณและทำงานต่อไปได้

สำหรับนักเขียน ทุกอย่างง่ายกว่ามาก ในทางกลับกัน พวกเขายินดีด้วยซ้ำเมื่อผู้เขียนมีสไตล์เป็นของตัวเอง และโครงเรื่องก็น่าสับสนและคาดเดาไม่ได้

สิ่งเดียวที่เราสามารถเปรียบเทียบกับโปรแกรมเมอร์ได้คือผู้สร้างละครโทรทัศน์ซึ่งโดยพื้นฐานแล้วยังเขียนโปรแกรมสำหรับนักแสดงเท่านั้น ผู้เขียนบทเช่นเราทำงานเป็นทีม พวกเขายังมีกำหนดเวลา มีกำหนดฉาย พวกเขายังต้องคิดให้ละเอียดถึงความซับซ้อนของโครงเรื่องในหัวของพวกเขา หรือแม้แต่วางความเป็นไปได้ในการเปลี่ยนโครงเรื่องในอนาคต เพิ่มตัวละครใหม่ หรือการฟื้นคืนชีพ คนเก่า

แต่มีความแตกต่างที่สำคัญอย่างหนึ่ง: ผู้เขียนไม่สามารถเขียนเนื้อเรื่องของตอนที่ถ่ายทำได้อีกต่อไป อย่างดีที่สุดหากผู้ชมเข้าใจผิดก็จะชี้แจงให้ทราบในตอนต่อไป

พวกเราซึ่งเป็นโปรแกรมเมอร์ต้องกลับไปใช้โค้ดเก่าอยู่ตลอดเวลาและเปลี่ยนแปลงบางอย่างในนั้น ลองนึกภาพนวนิยายเล่มหนาที่คุณเขียนมาสิบปีแล้วและคุณต้องเขียนแต่ละบทซ้ำแล้วซ้ำเล่าจนกลายเป็นหนังระทึกขวัญ ทีนี้ลองนึกภาพว่าคุณได้ย้ายไปที่โปรเจ็กต์อื่นแล้วตอนนี้คุณต้องทำแบบเดียวกันกับข้อความที่คุณไม่เคยเห็นมาก่อนและเขียนโดยนักเขียนหลายคนแต่ละคนมีสไตล์เป็นของตัวเองและอีกอย่างก็มีทั้งหมดแล้ว ออกจากโครงการ

ดังนั้นการเรียนรู้การเขียนโปรแกรมจึงค่อนข้างง่าย แต่การจะทำอย่างมืออาชีพได้นั้น คุณต้องทำงานที่ยิ่งใหญ่ นักเขียนเริ่มต้นด้วยเรื่องสั้นเล็กๆ ค่อยๆ เชี่ยวชาญอุปกรณ์โวหารทั้งหมด เสริมสร้างสุนทรพจน์ และอ่านเองให้มาก ในทำนองเดียวกัน โปรแกรมเมอร์ต้องเขียนโปรแกรมมากมายและฝึกฝนทักษะของตนเอง และมันยากมาก! และคุณต้องปรับปรุงอย่างต่อเนื่องเป็นเวลาหลายปีหรือหลายทศวรรษ เป็นการวิ่งมาราธอนที่ยาวนานเต็มไปด้วยหนามแหลมและความสุข ไม่มีแรงจูงใจทางการเงินหรืออื่นใดที่จะช่วยคุณได้ - มีเพียงความสนใจของคุณในเรื่องนี้เท่านั้น

ฉันได้พบกับผู้ชายที่จำการเขียนโปรแกรมได้แม้กระทั่งอ่านหนังสือบางเล่มในสาขานี้และเริ่มหางานทำ แต่ในขณะเดียวกันพวกเขาก็ไม่ได้เขียนโปรแกรมของตัวเองแม้แต่โปรแกรมเดียว คุณลองนึกภาพนักเขียนที่แทบไม่เชี่ยวชาญการอ่านออกเขียนได้และไม่ได้เขียนเรื่องเลยสักเรื่องแล้วอยากทำงานในกองบรรณาธิการอยู่แล้ว? เขาไม่รู้ด้วยซ้ำว่าเขาจะชอบกิจกรรมนี้หรือไม่และจะสามารถประสบความสำเร็จได้หรือไม่ แต่เขากำลังนับเงินเดือนของเขาแล้ว! อย่างไรก็ตาม ผู้ที่อยากเป็นโปรแกรมเมอร์จำนวนมากยังคงหางานทำอยู่ พวกเขาทำงานได้ไม่ดี แต่ก็มีงานหลายอย่างที่คุณภาพไม่สำคัญเสมอไป

โปรแกรมเมอร์ค่อยๆ พัฒนาคำศัพท์ระดับมืออาชีพของตนเอง พวกเขาเรียกกระบวนการเขียนโค้ดโปรแกรม และผู้ที่เชี่ยวชาญเฉพาะสิ่งนี้จะเรียกว่าผู้เขียนโค้ดอย่างดูถูก พวกเขาสามารถเขียนบางอย่างเพื่อให้คุณใช้งานได้ แต่จะเป็นเรื่องยากมากและไม่เป็นที่พอใจในการปรับปรุงและปรับปรุงโปรแกรมดังกล่าว โดยปกติแล้วจะเขียนใหม่ได้ง่ายกว่า ผู้เขียนโค้ดเรียกตัวเองว่านักพัฒนา และเมื่อเวลาผ่านไป เมื่อได้รับประสบการณ์ หลายคนก็เริ่มเรียกตนเองว่าวิศวกรซอฟต์แวร์

โอเค ถ้าการเขียนโปรแกรมเป็นเหมือนการรู้หนังสือ คุณจำเป็นต้องรู้อะไรอีกและสามารถทำอะไรได้อีกเพื่อที่จะเป็น "นักเขียน"?

จากสาขาวิชาเทคโนโลยีและทักษะที่หลากหลายค่อยๆตกผลึกทั้งแบบทั่วไปและแบบซ้ำ ๆ ซึ่งในทางปฏิบัติกลับกลายเป็นว่ามีประโยชน์มากที่สุดสำหรับโปรแกรมเมอร์ น่าเสียดายที่สิ่งนี้ไม่คงที่เช่นกัน ตัวอย่างเช่น เมื่อสามสิบปีที่แล้ว โปรแกรมเมอร์ส่วนใหญ่ต้องการความรู้เกี่ยวกับอิเล็กทรอนิกส์ การประมวลผลสัญญาณ และรหัสเครื่องของคำสั่งโปรเซสเซอร์ (แอสเซมเบลอร์)

วันนี้คุณสามารถรับมือกับงานได้สำเร็จโดยปราศจากความรู้นี้ และฉันก็ตกใจมากเมื่อได้พบกับนักพัฒนาอาวุโสที่เข้าใจวิธีการทำงานของโปรเซสเซอร์อย่างคลุมเครือเท่านั้น แต่ในช่วงสามสิบปีที่ผ่านมาอินเทอร์เน็ตได้ปรากฏขึ้น และโปรแกรมต่างๆ ก็มีขนาดใหญ่และซับซ้อนมาก และทักษะและความรู้อื่นๆ มากมายได้ถูกเพิ่มเข้ามา ซึ่งเป็นสิ่งที่ขาดไม่ได้ในปัจจุบัน: กระบวนการพัฒนาที่ยืดหยุ่น กระบวนทัศน์การเขียนโปรแกรมเชิงวัตถุและเชิงฟังก์ชัน การสร้างระบบที่ปรับขนาดได้ โหลดสูงและทนทานต่อข้อผิดพลาด และคุณยังต้องสามารถอ่านและ ทำงานกับโค้ดเก่า ใช้ระบบควบคุมเวอร์ชัน คุณไม่สามารถทำได้หากไม่มีทักษะบังคับเช่นความสามารถในการค้นหาบนอินเทอร์เน็ตซึ่งไม่เคยมีมาก่อน

ทั้งหมดนี้อยู่นอกเหนือขอบเขตของการเขียนโปรแกรม และในทางที่เป็นมิตร จำเป็นต้องมีคำศัพท์แยกต่างหาก โดยส่วนตัวแล้ว เพื่อความชัดเจนยิ่งขึ้น ฉันเรียกมันว่า "การเขียนโปรแกรม" ซึ่งก็เหมือนกับวิศวกรรมซอฟต์แวร์ แต่เป็นคำที่กว้างกว่าซึ่งครอบคลุมถึงสิ่งที่สำคัญสำหรับเรา: กระบวนการพัฒนา ความสามารถในการตั้งโปรแกรมสมองของคุณเช่น "เข้าสู่กระแส"; ความสามารถในการทำงานเป็นทีมหรือเขียนเรซูเม่ - โดยทั่วไปแล้วทุกสิ่งที่เราทำ

พื้นฐานการเขียนโปรแกรม

ฉันโชคดีมากเพราะเกือบจะทันทีที่ฉันเริ่มสนใจการเขียนโปรแกรม ฉันได้อ่านหนังสือที่น่าทึ่งเล่มหนึ่ง - “Perfect Code” มันทำให้ฉันรู้สึกว่ามันไม่ใช่หนังสือเกี่ยวกับภาษาการเขียนโปรแกรมหรือเทคโนโลยีบางอย่างเหมือนกับทุกสิ่งทุกอย่างที่ฉันเคยเจอมาก่อน แต่เป็นหนังสือเกี่ยวกับการเขียนโปรแกรมด้วยตัวมันเอง นี่อาจเป็นหนังสือเล่มแรกที่พยายามเติมเต็มช่องว่างที่เหลือโดยการอ่านหนังสืออัลกอริทึม คู่มือทางเทคนิค และเอกสารประกอบ

และเธอก็ทันที เริ่มต้นด้วยคำอุปมาซึ่งช่วยถ่ายทอดสาระสำคัญของงานของเราได้แม่นยำยิ่งขึ้น คุณได้เรียนรู้เกี่ยวกับคำอุปมาทางวรรณกรรมแล้ว เมื่อเปรียบเทียบการเขียนโปรแกรมกับการเขียน แต่ก็มีคำเปรียบเทียบยอดนิยมที่เปรียบเทียบการเขียนโปรแกรมกับการสร้างบ้าน หรือแม้แต่การสร้างเครื่องบิน

ไม่ใช่เรื่องบังเอิญที่เธอชนะการสำรวจ “หากคุณสามารถย้อนเวลากลับไปตอนที่คุณยังเป็นนักพัฒนามือใหม่ได้ หนังสือเกี่ยวกับการเขียนโปรแกรมเล่มไหนที่คุณแนะนำให้ตัวเองอ่าน”

หนังสือดีๆ เกี่ยวกับการเขียนโปรแกรมอื่นๆ ก็ปรากฏขึ้น:

และสิ่งที่คู่ควรอื่น ๆ อีกมากมาย แต่โดยทั่วไปแล้วจะครอบคลุมบางประเด็นที่ลึกกว่า

จริงๆ แล้ว การเล่นแร่แปรธาตุของการเขียนโปรแกรมทั้งหมดนี้ประกอบด้วยสิ่งที่เราทำงานด้วยตลอดเวลาและจำเป็นต้องเข้าใจ:

  • พื้นฐานของเทคโนโลยีคอมพิวเตอร์ พื้นฐานของพีชคณิตบูลีน ระบบเลขฐานสอง และระบบจำนวนสิบหกแถว
  • โครงสร้างคอมพิวเตอร์: โปรเซสเซอร์, RAM, สแต็ก, ฮาร์ดไดรฟ์, กราฟิกการ์ด, บัส, อุปกรณ์ต่อพ่วง (เช่น คีย์บอร์ด, เมาส์)
  • แอสเซมเบลอร์โปรเซสเซอร์และ C - คุณต้องรู้จักพวกเขาอย่างน้อยก็นิดหน่อย
  • ความรู้เบื้องต้นจริงๆ แล้ว: ไวยากรณ์, วิธีประกาศตัวแปร, ฟังก์ชัน, วิธีเขียนคำสั่ง if แบบมีเงื่อนไข, ลำดับความสำคัญของตัวดำเนินการ, วิธีจัดระเบียบลูป, วิธีรับอินพุตจากผู้ใช้ และวิธีเอาท์พุต การเขียนโปรแกรมแบบมีโครงสร้าง - วิธีเขียนโดยไม่ต้องข้ามไป โดยใช้ลูปและการเรียกซ้ำ ง่ายมาก ผู้ปฏิบัติงาน 15 คนเรียนรู้ได้อย่างรวดเร็ว ภาษาโปรแกรมเกือบทั้งหมดที่ใช้ในปัจจุบันสืบทอดมาจาก C (C++, Java, C#, PHP, JavaScript) ดังนั้นจึงไม่จำเป็นต้องเรียนรู้ใหม่ ดังนั้นจึงไม่สำคัญอย่างยิ่งว่าคุณจะเริ่มเรียนรู้ภาษาใดในภาษาเหล่านี้
  • อัลกอริทึม: การค้นหาแบบเดรัจฉานเชิงเส้น, การค้นหาแบบไบนารี, การเรียงลำดับแบบฟอง, การเรียงลำดับแบบรวดเร็ว ฯลฯ การประมาณค่าความซับซ้อนของอัลกอริทึม
  • โครงสร้างข้อมูล: สตริง คิว สแต็ก รายการลิงก์เดี่ยวและคู่ อาร์เรย์ ฯลฯ
  • การสลายตัว นามธรรม และการออกแบบโปรแกรม: การเขียนโปรแกรมเชิงวัตถุ ของแข็ง รูปแบบการออกแบบ แผนภาพ UML
  • พื้นฐานของการเขียนโปรแกรมเชิงฟังก์ชัน: วิธีเขียนโดยไม่ต้องมอบหมายงานและลูปแบบทำลายล้าง ทำงานกับคอลเลกชันในรูปแบบเชิงฟังก์ชัน
  • ความรู้เกี่ยวกับแพลตฟอร์ม ไลบรารี เทคโนโลยี: Java Core การทำงานกับไฟล์ การทำงานกับเครือข่าย การทำงานกับอาร์เรย์ สตริงและคอลเลกชัน การทำงานกับหน่วยความจำและการรวบรวมขยะ มีหนังสือหนาเกี่ยวกับเรื่องทั้งหมดนี้จากผู้สร้างเทคโนโลยีเอง (เช่น "Effective Java")
  • มาตรฐานเครือข่ายและโปรโตคอล: TCP, UDP, HTTP, HTML, XML, JSON, MIME, RFC
  • ความสามารถในการเขียนโค้ดที่สะอาด: วิธีตั้งชื่อตัวแปรและคลาสอย่างถูกต้อง, วิธีจัดรูปแบบโค้ด, วิธีเขียนความคิดเห็นอย่างถูกต้อง (แม่นยำยิ่งขึ้น, จะไม่เขียนอย่างไร :-)) ความเข้าใจเกิดขึ้นหลังจากอ่านหนังสือ Clean Code
  • ความสามารถในการทำงานกับโค้ด: การรีแฟคเตอร์ (หนังสือของ Fowler), ปุ่มลัด IDE สำหรับการรีแฟคเตอร์, ความสามารถในการอ่านและบำรุงรักษาโค้ดเก่า
  • แนวปฏิบัติทางวิศวกรรม: การทดสอบหน่วย, การเขียนโปรแกรมขั้นสูง (XP), การบูรณาการอย่างต่อเนื่อง, ระบบควบคุมเวอร์ชัน (Git, SVN)
  • การจัดการโครงการและการจัดกระบวนการ: Waterfall, Agile, SCRUM, Kanban, ตัวติดตามจุดบกพร่อง, การประมาณเวลาสำหรับงาน
  • ทักษะทางอารมณ์: ความสามารถในการสื่อสารกับลูกค้าและเข้ากันได้เป็นทีม เอาชนะการขาดแรงจูงใจ เลือกลำดับความสำคัญ
  • ฐานข้อมูล: SQL, ฐานข้อมูลเชิงสัมพันธ์, เชิงเอกสารและกราฟ, ACID, ทฤษฎีบท CAP, การเพิ่มประสิทธิภาพคิวรี
  • ระบบปฏิบัติการ: Linux, การติดตั้งและกำหนดค่าโปรแกรมบนนั้น, บรรทัดคำสั่ง
  • การปรับขนาดและโหลดสูง การตรวจสอบ การบันทึก ความทนทานต่อข้อผิดพลาด
  • การเข้ารหัสการป้องกันการโจมตี
  • การใช้งาน การรวบรวมความต้องการ
  • มีความรู้ภาษาอังกฤษ สามารถเขียนเอกสารได้ชัดเจนและรัดกุม
  • ความสามารถในการกำหนดคำถามอย่างถูกต้องและค้นหาคำตอบได้อย่างอิสระ
  • ความสามารถในการเรียนรู้และพัฒนาตนเองอย่างต่อเนื่อง
  • ความสามารถในการสอนผู้อื่น อธิบายให้ชัดเจน และแม้กระทั่งพูดคุยกับสาธารณชนในที่ประชุม...
  • และในขณะเดียวกันก็ไม่บ้า

อย่างที่คุณเห็น รายการนี้สามารถดำเนินต่อไปได้ แต่คุณต้องเข้าใจสิ่งสำคัญ: การเขียนโปรแกรมนั้นเป็นเพียงเพียงเล็กน้อยเท่านั้น ทักษะอื่นๆ เกือบทั้งหมดแทบจะเป็นไปไม่ได้เลยที่จะเรียนรู้ คุณสามารถมาหาพวกเขาผ่านประสบการณ์ที่กว้างขวางและการอ่านหนังสือที่ถูกต้องอย่างต่อเนื่องซึ่งจะช่วยให้คุณคิดใหม่ได้