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

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

6
การแยกโครงการยูทิลิตี“ ปึกแผ่น” ออกเป็นส่วนประกอบแต่ละส่วนด้วยการพึ่งพา“ ทางเลือก”
ในช่วงหลายปีที่ผ่านการใช้ C # /. NET สำหรับโครงการภายในองค์กรเรามีห้องสมุดหนึ่งแห่งที่เติบโตขึ้นอย่างเป็นองค์กร มันถูกเรียกว่า "Util" และฉันแน่ใจว่าพวกคุณหลายคนเคยเห็นสัตว์ร้ายตัวนี้ในอาชีพของคุณ หลายส่วนของไลบรารีนี้เป็นแบบสแตนด์อโลนและสามารถแบ่งออกเป็นโครงการแยกต่างหาก (ซึ่งเราต้องการเปิดแหล่งที่มา) แต่มีปัญหาสำคัญอย่างหนึ่งที่ต้องแก้ไขก่อนที่สิ่งเหล่านี้จะถูกปล่อยเป็นห้องสมุดแยกต่างหาก โดยทั่วไปมีหลายกรณีที่ฉันอาจเรียกว่า"การพึ่งพาเพิ่มเติม"ระหว่างไลบรารีเหล่านี้ เพื่ออธิบายสิ่งนี้ให้ดีขึ้นพิจารณาบางส่วนของโมดูลที่เป็นตัวเลือกที่ดีในการเป็นห้องสมุดแบบสแตนด์อะโลน CommandLineParserใช้สำหรับการแยกบรรทัดคำสั่ง XmlClassifyใช้สำหรับการทำให้คลาสเป็นอนุกรมเป็น XML PostBuildCheckทำการตรวจสอบในแอสเซมบลีที่คอมไพล์แล้วและรายงานข้อผิดพลาดการคอมไพล์ถ้าพวกเขาล้มเหลว ConsoleColoredStringเป็นห้องสมุดสำหรับตัวอักษรสตริงสี Lingoสำหรับแปลอินเทอร์เฟซผู้ใช้ แต่ละไลบรารีเหล่านี้สามารถใช้งานแบบสแตนด์อโลนได้อย่างสมบูรณ์ แต่หากใช้ร่วมกันจะมีคุณสมบัติพิเศษที่มีประโยชน์ ยกตัวอย่างเช่นทั้งสองCommandLineParserและเปิดเผยการทำงานตรวจสอบการโพสต์การสร้างที่ต้องใช้XmlClassify PostBuildCheckในทำนองเดียวกันCommandLineParserช่วยให้เอกสารตัวเลือกที่จะให้ใช้ตัวอักษรของสตริงสีที่กำหนดและสนับสนุนเอกสารแปลผ่านทางConsoleColoredStringLingo ดังนั้นความแตกต่างที่สำคัญคือว่าเหล่านี้เป็นคุณสมบัติเสริม หนึ่งสามารถใช้ตัวแยกวิเคราะห์บรรทัดคำสั่งกับสตริงธรรมดาไม่มีสีโดยไม่ต้องแปลเอกสารหรือดำเนินการตรวจสอบหลังการสร้างใด ๆ หรืออาจทำให้เอกสารแปลได้ แต่ยังคงไม่มีสี หรือทั้งสีและแปลได้ เป็นต้น เมื่อมองผ่านห้องสมุด "Util" นี้ฉันเห็นว่าห้องสมุดที่อาจแยกได้เกือบทั้งหมดมีคุณสมบัติที่เป็นทางเลือกเช่นนี้ซึ่งผูกไว้กับไลบรารีอื่น ๆ ถ้าฉันต้องการห้องสมุดเหล่านั้นจริงๆแล้วการพึ่งพาสิ่งต่าง ๆ นี้ไม่ได้ถูกยกเลิกการผูกมัดจริงๆ: คุณยังคงต้องการไลบรารีทั้งหมดถ้าคุณต้องการใช้เพียงอันเดียว มีวิธีการที่จัดตั้งขึ้นเพื่อจัดการการพึ่งพาทางเลือกเช่นใน.

5
วิธีให้โปรแกรมที่แตกต่างกันสองภาษาที่มีสองภาษาต่างกันโต้ตอบกันอย่างไร
ฉันไม่รู้ว่ามันกว้างเกินไปหรือไม่ แต่ฉันเป็นโปรแกรมเมอร์อายุน้อยที่ยังเรียนอยู่ในวิทยาลัย ฉันรู้สึกว่าฉันมีภาษาที่ดีพอสำหรับภาษาอื่นและมีพื้นฐานที่ดี แต่ฉันสะดุดที่จะคิดว่าถ้าเช่นฉันพยายามสร้างโปรแกรมและบอกว่าฉันเขียนส่วนหนึ่งในหลามเพียงเพราะมันง่ายและทำงาน แต่โปรแกรมนี้จะต้องได้รับผลลัพธ์จากโปรแกรมอื่นที่ฉันเขียน ใน C และฉันใช้ C เนื่องจากความเร็ว ฉันไม่แน่ใจว่าจะให้โปรแกรมและภาษาที่ต่างกันสองแบบโต้ตอบกันอย่างไรเพื่อสร้างโปรแกรมทั้งหมดหนึ่งโปรแกรม ฉันคิดเหมือนว่าคุณสามารถเขียนไฟล์ได้ แต่ถ้าโปรแกรมไพ ธ อนและโปรแกรม C เข้าถึงไฟล์ฉันจะต้องคิดถึงล็อค เวลาส่วนใหญ่ที่ฉันทำนี่คือการนำเข้าไฟล์เข้าสู่โปรแกรม แต่ในกรณีนั้นพวกเขาเป็นภาษาเดียวกันดังนั้นมันจึงเป็นเรื่องง่ายฉันแค่ใช้ฟังก์ชั่นการนำเข้า แต่ด้วยสองภาษา / โปรแกรมที่โต้ตอบกันเพื่อสร้างผลลัพธ์หนึ่งเหนียว . ฉันกำลังคิดเกี่ยวกับคำถามนี้เพราะฉันกำลังคิดที่จะดำน้ำในการสร้างแอปพลิเคชันเว็บขั้นพื้นฐานเพียงเพื่อเรียนรู้ แต่ฉันไม่รู้ว่าจะพูดไฟล์จาวาสคริปต์แบบโต้ตอบกับสิ่งที่ฉันเขียนในภาษาไพ ธ อนหรือในทางกลับกันได้อย่างไร ฉันรู้สึกเหมือนฉันกำลังพลาดอะไรบางอย่างที่นี่และไม่เข้าใจ ขออภัยถ้าคำถามนี้กว้างเกินไป แต่ฉันไม่พบคำตอบที่ชัดเจนออนไลน์ฉันพยายามค้นหา opensource webapp แต่ไม่เข้าใจคำตอบจริงๆจากนั้นให้อภัยฉันอีกครั้งถ้าคำถามดูเหมือนว่าฉันคิดว่าโง่ นี่เป็นสถานที่ที่ดีที่จะถามฉันรักการอ่านบน stackexchange ขอบคุณสำหรับการตอบกลับใด ๆ
26 python  c 

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

5
ทำไมถึงเรียกว่า“ ตารางแฮช” หรือ“ ฟังก์ชันแฮช”? แฮชไม่สมเหตุสมผลสำหรับฉันที่นี่ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิด5 เดือนที่ผ่านมา ตอนนี้เป็นเวลาประมาณ 4 ปีของการพัฒนาที่ฉันใช้การได้ยินการพูดคุยและการใช้ตารางแฮชและฟังก์ชันแฮช แต่ฉันไม่เคยเข้าใจเลยว่าทำไมมันถึงเรียกว่าแฮช? ฉันจำได้ว่าวันแรกที่ฉันเริ่มเขียนโปรแกรมคำศัพท์นี้ช่างยุ่งยากสำหรับฉัน ฉันไม่เคยคิดออกว่ามันคืออะไรตามชื่อของมัน ฉันเพียงแค่การทดลองที่เข้าใจสิ่งที่มันไม่และทำไมและเมื่อเราควรจะใช้มัน แต่ผมยังคงบางครั้งพยายามที่จะคิดออกว่าทำไมมันเรียกว่ากัญชา ฉันไม่มีปัญหากับโต๊ะหรือฟังก์ชั่นและพูดตามตรงพวกเขาค่อนข้างหักทอนเหตุผลที่สมเหตุสมผล แต่ผมคิดว่าคำพูดที่ดีขึ้นสามารถนำมาใช้แทนกัญชาเช่นคีย์หรือเอกลักษณ์ อย่าคีย์ตารางหรือตารางที่ไม่ซ้ำกัน ตามพจนานุกรมของฉันแฮชหมายถึง: ผัดมันฝรั่งและเนื้อสัตว์ (ไม่เกี่ยวข้องสูง) # symbol (เครื่องหมายหมายเลข AKA, เครื่องหมายปอนด์ ฯลฯ ) (ยังไม่เกี่ยวข้องอาจเป็นเพียงการตั้งชื่อผิด) ใช้อัลกอริทึมกับสตริงอักขระ (ยังไม่มีส่วนเกี่ยวข้องกับเอกลักษณ์ซึ่งเป็นคุณลักษณะที่สำคัญที่สุดของตารางแฮช) ตัดอาหาร อีกคำสำหรับกัญชา ไม่มีใครรู้ว่าทำไมมันเรียกว่าแฮช
26 naming 


4
ทำไมทีมพัฒนายืนยันว่าการใช้โซลูชันเดียวสำหรับหลายโครงการใน Visual Studio“ เพิ่มความซับซ้อนในการพึ่งพาซึ่งกันและกัน”
ฉันช่วยจัดการทีมภายนอกที่เริ่มพัฒนาผลิตภัณฑ์ใหม่ที่มีอยู่บางรุ่น ในอดีตทีมนี้มักจะใช้รูปแบบของโครงการเดียวในโซลูชันเดียวสำหรับโมดูลประมาณ 30 โมดูลใน Visual Studio ซึ่งทำงานร่วมกันเพื่อสร้างโครงสร้างที่ปรับใช้ได้ สิ่งนี้มีผลกระทบที่เป็นอันตรายต่อการสร้างความน่าเชื่อถือและคุณภาพเนื่องจากพวกเขาไม่ได้ส่งซอร์สโค้ดที่ทันสมัยที่สุดมาให้เราเสมอ เราพยายามที่จะกดพวกเขาเพื่อรวมรหัสอ้างอิงทั้งหมดในโซลูชันเดียว แต่เราได้รับการต่อต้าน - โดยเฉพาะพวกเขาพูดคุยเกี่ยวกับการพึ่งพาซึ่งกันและกันระหว่างโมดูล (อ่าน "โครงการ" ใน Visual Studio) เพิ่มขึ้นหากทุกอย่างอยู่ใน ไฟล์โซลูชันเดียว ไม่มีการใช้รหัสใดในโซลูชันแยกต่างหากที่อื่น ฉันยืนยันว่านี่เป็นเรื่องไร้สาระและรูปแบบการพัฒนาที่ดีจะหลีกเลี่ยงปัญหาดังกล่าว ทีมที่มีปัญหายังดำเนินการแก้ไขข้อผิดพลาดและการพัฒนาคุณสมบัติใหม่ในผลิตภัณฑ์ที่มีอยู่ซึ่งประสบการณ์ที่ได้รับนั้นเต็มไปด้วยปัญหาที่พูดได้น้อยที่สุดและได้รับความทุกข์ทรมานจากปัญหาเดียวกัน เราถูกปฏิเสธการเข้าถึงแหล่งควบคุม ( TFS ) ของพวกเขาและวิธีการที่เราดำเนินการเพื่อรวมรหัสฐานคือการพยายามและลดจำนวนของการอัปเดตที่ขาดหายไปและอย่างน้อยก็ลดลงเป็นครั้งคราว (ใช่แล้ว - แนะนำให้รู้จักกับผลิตภัณฑ์) โดยการพูดว่า "ส่ง ZIP ของโฟลเดอร์โซลูชันทั้งหมดให้เราเพื่อให้เราสามารถคลายซิปเปิดใน Visual Studio และกดF5 สำหรับการทดสอบ "ในแง่ของโครงสร้างและคุณภาพทั่วไปรหัสนั้นค่อนข้างแย่และยากที่จะให้การสนับสนุนประสบการณ์นี้เป็นสาเหตุที่ฉันตั้งใจจะทำให้กระบวนการทำงานถูกต้องในช่วงต้นของการพัฒนาให้เร็วที่สุดเท่าที่จะทำได้ มีบางอย่างที่ฉันขาดหายไปหรือไม่? มีเหตุผลที่ดีที่จะแยกรหัสทั้งหมดออกไหม สำหรับเงินของฉันมันจะต้องมีเหตุผลที่น่าสนใจดังนั้นมันจึงเป็นความรู้ทั่วไป แต่ฉันก็เต็มใจที่จะยอมรับว่าฉันไม่รู้ทุกอย่าง

2
คุณลักษณะความหมายของ Python (และภาษาไดนามิกอื่น ๆ ) มีส่วนทำให้ความช้าของมันคืออะไร?
ฉันไม่รู้จัก Python มาก ฉันพยายามที่จะเข้าใจอย่างแม่นยำมากขึ้นว่าคุณลักษณะที่แน่นอนของภาษาแบบไดนามิก (à la Python, Lua, Scheme, Perl, Ruby, .... ) กำลังบังคับให้การใช้งานของพวกเขาช้า ในกรณีนี้ Lua 5.3 เครื่องจักร metatableจะทำให้ Lua ค่อนข้างสังหรณ์ใจ แต่ในทางปฏิบัติ Lua มีข่าวลือว่าค่อนข้างเร็ว (และเร็วกว่า Python) นอกจากนี้ผมมีสัญชาตญาณ (อาจจะผิดอย่างใดอย่างหนึ่ง) ว่าตั้งแต่โปรเซสเซอร์ปัจจุบันหน่วยความจำได้ช้ากว่าการคำนวณดิบ (เข้าถึงหน่วยความจำแคชพลาดความต้องการในเวลาเดียวกันเป็นหลายร้อยดำเนินการทางคณิตศาสตร์), พิมพ์แบบไดนามิกการตรวจสอบ (เมนูif (value->type != INTEGER_TAG) return;ใน C parlance) สามารถวิ่งได้ค่อนข้างเร็ว แน่นอนว่าการวิเคราะห์โปรแกรมทั้งหมด (เช่นการดำเนินการตามโครงการของสตาลิน ) สามารถทำให้การใช้ภาษาแบบไดนามิกเป็นนักแปลทำงานได้อย่างรวดเร็ว แต่ลองทำเป็นว่าฉันไม่มีเวลาออกแบบตัววิเคราะห์โปรแกรมทั้งหมดในตอนแรก (ฉันกำลังออกแบบภาษาไดนามิกในจอภาพ MELTของฉันและบางส่วนจะถูกแปลเป็น C)


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

3
การขัดหมายถึงอะไรในการเขียนโปรแกรม?
ฉันมักจะได้ยินคำว่า "ต้นขั้ว", "ต้นขั้วบางอย่างออก", "ต้นขั้ว" และอื่น ๆ การขัดหมายถึงอะไรในการเขียนโปรแกรมและคำนั้นมาจากไหน สามารถใช้บริบทใดได้บ้าง

3
ที่ควรวางตรรกะทางธุรกิจหลามใน django
ฉันเพิ่งเริ่มเรียนรู้การพัฒนา Django / Python / Web ปัญหานี้ทำให้ฉันหนักใจมาระยะหนึ่งแล้ว ฉันกำลังสร้างแอปพลิเคชันที่มีแม่แบบหลายรายการใน Django ฉันมี views.py ซึ่งเป็นเพียงการแสดงผลการตอบสนองต่อเทมเพลตนั้นและฉันมี models.py ที่ฉันได้จัดทำฐานข้อมูลของฉัน ในหนึ่งในเทมเพลตของฉันฉันต้องอัปโหลดภาพ (ซึ่งฉันสามารถทำได้) และฉันต้องเรียกใช้ลอจิกซึ่งขึ้นอยู่กับคุณสมบัติของภาพที่อัปโหลด (ยังไม่เสร็จ) ตรรกะนี้เกี่ยวข้องกับการคำนวณจำนวนมาก หลังจากทำการคำนวณตรรกะควรส่งคืนข้อมูล (พิกัด) ที่ประมวลผลไปยังเทมเพลต ฉันสามารถดำเนินการทั้งหมดนี้ได้สำเร็จในแอปพลิเคชันหลามแบบสแตนด์อโลนสำหรับการเรียกใช้ไฟล์หลามหลังจากที่อื่น อย่างไรก็ตามเนื่องจากตอนนี้ฉันต้องการทำให้เว็บแอปพลิเคชันนี้ฉันเริ่มใช้เฟรมเวิร์ก Django ฉันทำการค้นหาจำนวนมาก แต่ฉันยังคงไม่สามารถระบุได้ว่าฉันควรวางไฟล์ Python นี้ตรงไหนกับตรรกะทั้งหมด ฉันควรจะมีไฟล์ที่ใช้คลาสอื่น(logic.py)และเรียกมันจากview.py? ฉัน googled และพบว่านักพัฒนาจำนวนมากวางตรรกะทางธุรกิจของตนใน models.py ใน Django อย่างไรก็ตามฉันรู้สึกว่ามันไม่ถูกต้องเพราะรูปแบบควรสื่อสารกับส่วนหลังเท่านั้น ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมขอบคุณล่วงหน้า

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

4
เหตุใด C ++ และ Java ทั้งสองจึงใช้แนวคิดของ“ การอ้างอิง” แต่ไม่เข้าใจ
ใน C ++ อาร์กิวเมนต์การอ้างอิงไปยังฟังก์ชันอนุญาตให้ฟังก์ชันทำการอ้างอิงถึงสิ่งอื่น: int replacement = 23; void changeNumberReference(int& reference) { reference = replacement; } int main() { int i = 1; std::cout << "i=" << i << "\n"; // i = 1; changeNumberReference(i); std::cout << "i=" << i << "\n"; // i = 23; } อะนาล็อกอาร์กิวเมนต์อ้างอิงคงที่ไปยังฟังก์ชันจะแสดงข้อผิดพลาดเวลารวบรวมถ้าเราพยายามเปลี่ยนการอ้างอิง: void changeNumberReference(const …
26 java  c++  pointers  reference 

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

5
วิธีการ refactor โปรแกรม OO เป็นหนึ่งทำงานได้อย่างไร
ฉันมีปัญหาในการค้นหาแหล่งข้อมูลเกี่ยวกับวิธีการเขียนโปรแกรมในสไตล์การใช้งาน หัวข้อขั้นสูงที่สุดที่ฉันสามารถหาได้ทางออนไลน์คือการใช้โครงสร้างการพิมพ์เพื่อลดลำดับชั้นของชั้นเรียนลง ส่วนใหญ่เพียงจัดการกับวิธีการใช้แผนที่ / พับ / ลด / ฯลฯ เพื่อแทนที่ลูปที่จำเป็น สิ่งที่ฉันต้องการค้นหาจริงๆคือการสนทนาในเชิงลึกเกี่ยวกับการใช้งาน OOP ของโปรแกรมที่ไม่น่าสนใจข้อ จำกัด และวิธีการปรับโครงสร้างในลักษณะการทำงาน ไม่ใช่แค่อัลกอริธึมหรือโครงสร้างข้อมูล แต่มีบางอย่างที่มีบทบาทและแง่มุมที่แตกต่างกัน - อาจเป็นวิดีโอเกม โดยวิธีที่ฉันได้อ่าน Real-World Function Programming โดย Tomas Petricek แต่ฉันก็อยากได้มากกว่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.