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

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

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

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


5
การเขียนโปรแกรมแบบอะซิงโครนัสในภาษาเชิงหน้าที่
ฉันส่วนใหญ่เป็นโปรแกรมเมอร์ C / C ++ ซึ่งหมายความว่าประสบการณ์ส่วนใหญ่ของฉันอยู่กับกระบวนทัศน์เชิงกระบวนทัศน์และเชิงวัตถุ อย่างไรก็ตามในขณะที่โปรแกรมเมอร์ C ++ หลายคนตระหนักดี C ++ ได้เปลี่ยนการเน้นในช่วงหลายปีที่ผ่านมาเป็นรูปแบบการใช้งานแบบเอสคิว ไม่ว่าในขณะที่ฉันมีประสบการณ์การเขียนโค้ดในรูปแบบการทำงานโดยใช้ C ++ ฉันมีประสบการณ์น้อยมากกับภาษาที่ใช้งานได้จริงเช่น Lisp, Haskell เป็นต้น ฉันเพิ่งเริ่มศึกษาภาษาเหล่านี้เนื่องจากความคิดที่ว่า "ไม่มีผลข้างเคียง" ในภาษาที่ใช้งานได้ล้วนทำให้ฉันทึ่งเสมอโดยเฉพาะอย่างยิ่งเกี่ยวกับแอพพลิเคชั่นของมันในการทำงานพร้อมกันและการคำนวณแบบกระจาย อย่างไรก็ตามมาจากพื้นหลัง C ++ ฉันสับสนว่า philsophy "ไม่มีผลข้างเคียง" นี้ทำงานร่วมกับการเขียนโปรแกรมแบบอะซิงโครนัสได้อย่างไร โดยการเขียนโปรแกรมแบบอะซิงโครนัสฉันหมายถึงเฟรมเวิร์ก / API / รูปแบบการเข้ารหัสที่ให้ผู้ใช้จัดการเหตุการณ์เพื่อจัดการเหตุการณ์ที่เกิดขึ้นแบบอะซิงโครนัส (นอกกระแสของโปรแกรม) ซึ่งรวมถึงไลบรารีแบบอะซิงโคร ตัวจัดการสัญญาณหรือตัวจัดการเหตุการณ์ Java GUI สิ่งหนึ่งที่สิ่งเหล่านี้มีเหมือนกันคือธรรมชาติของการเขียนโปรแกรมแบบอะซิงโครนัสดูเหมือนจะต้องการการสร้างผลข้างเคียง (สถานะ) เพื่อให้กระแสหลักของโปรแกรมตระหนักว่ามีการเรียกใช้ตัวจัดการเหตุการณ์แบบอะซิงโครนัส โดยทั่วไปในเฟรมเวิร์กเช่น Boost.ASIO ตัวจัดการเหตุการณ์จะเปลี่ยนสถานะของวัตถุเพื่อให้เอฟเฟกต์ของเหตุการณ์นั้นแพร่กระจายเกินเวลาชีวิตของฟังก์ชันตัวจัดการเหตุการณ์ จริงๆแล้วตัวจัดการเหตุการณ์สามารถทำอะไรได้อีก? ไม่สามารถ "ส่งคืน" ค่าไปยังจุดโทรได้เนื่องจากไม่มีจุดโทร …


5
เมื่อใดจึงจะใช้พจนานุกรม vs tuple ใน Python
ตัวอย่างที่เฉพาะเจาะจงในใจคือรายการชื่อไฟล์และขนาดของไฟล์ ฉันไม่สามารถตัดสินใจได้ว่ารายการในรายการแต่ละคนควรอยู่ในรูปแบบหรือเพียงแค่{"filename": "blabla", "size": 123} ("blabla", 123)พจนานุกรมดูเหมือนว่าฉันจะมีเหตุผลมากกว่าเพราะการเข้าถึงขนาดfile["size"]นั้นมีคำอธิบายมากกว่าfile[1]... แต่ฉันไม่รู้จริงๆ คิด?

5
การเอาชนะวิธีที่เป็นรูปธรรมนั้นเป็นกลิ่นของรหัสหรือไม่?
มันเป็นความจริงหรือไม่ที่วิธีการที่เป็นรูปธรรมที่สำคัญคือกลิ่นรหัส? เพราะฉันคิดว่าถ้าคุณต้องการแทนที่วิธีที่เป็นรูปธรรม: public class A{ public void a(){ } } public class B extends A{ @Override public void a(){ } } มันสามารถเขียนใหม่เป็น public interface A{ public void a(); } public class ConcreteA implements A{ public void a(); } public class B implements A{ public void a(){ } } และถ้า B …

4
การใช้งานสายอักขระ / หมายเลข [ปิด]
นี่เป็นหัวข้อที่ถกเถียงกันอยู่และฉันคิดว่ามีความคิดเห็นมากเท่ากับที่มีโปรแกรมเมอร์ แต่เพื่อประโยชน์ของมันฉันต้องการทราบว่าการปฏิบัติทั่วไปในธุรกิจคืออะไร (หรือในที่ทำงานของคุณ) ในที่ทำงานของฉันเรามีแนวทางการเข้ารหัสที่เข้มงวด ส่วนหนึ่งของนั้นจะทุ่มเทให้กับสายอักขระ / หมายเลข มันระบุ (สำหรับ C #): อย่าใช้ค่าตัวอักษรตัวเลขหรือสตริงในรหัสของคุณนอกเหนือจากการกำหนดค่าคงที่เชิงสัญลักษณ์ ใช้รูปแบบต่อไปนี้เพื่อกำหนดค่าคงที่: public class Whatever { public static readonly Color PapayaWhip = new Color(0xFFEFD5); public const int MaxNumberOfWheels = 18; } มีข้อยกเว้นคือค่า 0, 1 และ null สามารถใช้ได้อย่างปลอดภัยเกือบตลอดเวลา บ่อยครั้งที่ค่า 2 และ -1 ก็โอเคเช่นกัน สตริงที่มีไว้สำหรับการบันทึกหรือการติดตามได้รับการยกเว้นจากกฎนี้ อนุญาตให้ใช้ตัวอักษรเมื่อความหมายชัดเจนจากบริบทและไม่ขึ้นอยู่กับการเปลี่ยนแปลงในอนาคต mean = (a + b) …

9
'<' กับ '! =' เป็นเงื่อนไขในการวนรอบ 'สำหรับ'?
สมมติว่าคุณมีforลูปต่อไปนี้: for (int i = 0; i &lt; 10; ++i) { // ... } ซึ่งมันมักจะเขียนด้วย: for (int i = 0; i != 10; ++i) { // ... } ผลลัพธ์ที่ได้จะเหมือนกันดังนั้นจึงมีข้อโต้แย้งที่แท้จริงสำหรับการใช้อย่างใดอย่างหนึ่งมากกว่าอื่น ๆ ? ส่วนตัวผมใช้ตัวแรกในกรณีiด้วยเหตุผลบางอย่างไปยุ่งเหยิงและข้ามค่า 10 * แก้ตัวการใช้หมายเลขเวทย์มนตร์ แต่เป็นเพียงตัวอย่างเท่านั้น
31 syntax 

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

5
เหตุใดสหภาพแรงงานจึงเลือกปฏิบัติที่เกี่ยวข้องกับการโปรแกรมเชิงปฏิบัติ
ในหลายปีของการเขียนโปรแกรม OO ฉันเข้าใจว่าสหภาพที่เลือกปฏิบัติคืออะไร แต่ฉันไม่เคยคิดถึงพวกเขาเลย ฉันเพิ่งได้เขียนโปรแกรมฟังก์ชั่นบางอย่างใน C # และตอนนี้ฉันพบว่าฉันอยากได้พวกเขา นี่ทำให้ฉันงุนงงเพราะบนใบหน้าของมันแนวคิดของสหภาพที่ถูกเลือกปฏิบัติดูเหมือนจะค่อนข้างเป็นอิสระจากการทำงานของขั้ว / OO มีบางสิ่งที่มีอยู่ในการเขียนโปรแกรมการทำงานที่ทำให้สหภาพแรงงานที่ถูกเลือกปฏิบัติมีประโยชน์มากกว่าพวกเขาจะอยู่ใน OO หรือว่าโดยการบังคับให้ตัวเองวิเคราะห์ปัญหาด้วยวิธีที่ "ดีกว่า" ฉันแค่ปรับมาตรฐานของฉัน รูปแบบ?

6
เมื่อใดควรอัปเดตการอ้างอิง
เรามีสองวิกฤตที่เกี่ยวข้องกับการพึ่งพาที่สำคัญสองฐานรหัสที่แตกต่างกัน (Android และเว็บแอป Node.js) repo Android จำเป็นต้องโยกย้ายจาก Flurry ไปยัง Firebase ซึ่งจำเป็นต้องอัปเดตห้องสมุด Google Play Services สี่เวอร์ชันหลัก มีสิ่งที่คล้ายกันเกิดขึ้นกับแอปโหนดที่โฮสต์โดย Heroku ซึ่งสแตกการผลิต (ซีดาร์) ของเราถูกเลิกใช้และจำเป็นต้องได้รับการอัพเกรดเป็นซีดาร์ -14 ฐานข้อมูล PostgreSQL ของเรายังต้องมีการอัพเดทจาก 9.2 เป็น 9.6 แต่ละแอพพลิเคชั่นของแอพเหล่านี้นั่งค้างได้เกือบสองปีและเมื่อแอพบางตัวเลิกใช้งานและเราถึงช่วงเวลา 'พระอาทิตย์ตก' มันเป็นอาการปวดหัวที่สำคัญในการอัปเดตหรือแทนที่ ฉันใช้เวลากว่า 30 ชั่วโมงในช่วงหนึ่งเดือนที่ผ่านมาหรือสองชั่วโมงค่อย ๆ แก้ไขข้อขัดแย้งและรหัสที่เสียหายทั้งหมด เห็นได้ชัดว่าการปล่อยให้สิ่งต่าง ๆ นั่งเป็นเวลาสองปีนั้นยาวนานเกินไป เทคโนโลยีดำเนินไปอย่างรวดเร็วโดยเฉพาะเมื่อคุณใช้ผู้ให้บริการแพลตฟอร์มอย่าง Heroku สมมติว่าเรามีชุดทดสอบเต็มรูปแบบและกระบวนการ CI เช่น Travis CI ซึ่งใช้การคาดเดามากมายในการอัปเดต เช่นถ้าฟังก์ชั่นถูกลบออกหลังจากการอัพเกรดและคุณใช้มันการทดสอบของคุณจะล้มเหลว ควรอัปเดตการอ้างอิงบ่อยเพียงใดหรือควรอัปเดตการอ้างอิงเมื่อใด เราอัปเดตเพราะเราถูกบังคับ แต่ดูเหมือนว่าวิธีการจองล่วงหน้าบางประเภทจะดีกว่า …

10
เหตุใดไลบรารีมาตรฐานจึงไม่เขียนโปรแกรมภาษาดั้งเดิม [ปิด]
ฉันคิดว่าเหตุใดจึงมี (ในภาษาการเขียนโปรแกรมทั้งหมดที่ฉันได้เรียนรู้เช่น C ++, Java, Python) ไลบรารีมาตรฐานอย่าง stdlib แทนที่จะมี "ฟังก์ชั่น" ที่คล้ายคลึงกันซึ่งเป็นภาษาดั้งเดิมของตัวเอง

6
ข้อผิดพลาดนับพัน!
ฉันเพิ่งได้รับมอบหมายให้ทำโครงการใหม่ จริง ๆ แล้วโครงการเก่าเขียนใน ASP คลาสสิก ตอนนี้มีการเขียนแอปพลิเคชันเวอร์ชันใหม่ใน ASP.NET ล่าสุด แต่ไม่คาดว่าจะเป็น RTM ในขณะที่ (วันที่วางจำหน่ายโดยประมาณคือมกราคม 2560) ดังนั้นฉันต้องทำการบำรุงรักษาบางอย่างในแอปพลิเคชันเก่าจนกว่าจะสามารถ ทิ้ง นอกจากนี้ฉันรู้สึกว่าลูกค้าบางคนจะไม่เปลี่ยนไปใช้โปรแกรมใหม่ทันทีดังนั้นเวอร์ชันนี้อาจจะอยู่พักหนึ่ง และปัญหาคือมันเต็มไปด้วยข้อผิดพลาด บางส่วนของมันย้อนหลังไปถึงศตวรรษที่ผ่านมาเมื่อไม่มีมาตรฐานเว็บและฉันไม่สนใจเกี่ยวกับโหมด Quirks widthและheightคุณลักษณะแทน CSS, ตารางที่ใช้สำหรับการจัดวางเฟรมเซต ฯลฯ แต่โอ้ข้อผิดพลาดเหล่านั้นทั้งหมด! width="20px"ทั่วทุกสถานที่onchange="javascript:..."และในสถานที่ที่พวกเขาใช้ CSS style="width:20"และstyle="width=20px"เป็นเรื่องธรรมดา ไม่ต้องพูดถึงสายมากมายที่มีความขัดแย้งwidthและstyleคุณลักษณะ เป็นต้น ฯลฯ เป็นผลให้แอปพลิเคชันเว็บทำงานภายใต้ IE เท่านั้นและในโหมดความเข้ากันได้เท่านั้น เป็นที่ชัดเจนว่านักพัฒนาไม่เคยดูความถูกต้องของรหัสเฉพาะเมื่อสิ่งที่ออกมาดูเหมือนสิ่งที่พวกเขามีอยู่ในใจมันควรมีลักษณะเช่นนั้น และฉันไม่รู้วิธีจัดการกับสิ่งนั้น ฉันพบว่าเป็นไปไม่ได้ที่จะหลับตากับข้อผิดพลาดเหล่านั้นในขณะที่มองหารหัสเพื่อหาข้อผิดพลาดอื่น ๆ แน่นอนว่าฉันสามารถทำการค้นหาทั่วโลกและแทนที่เพื่อให้ได้ปัญหาส่วนใหญ่ออกนอกเส้นทาง แต่นั่นหมายความว่าการมอบหมายครั้งแรกของฉันจะประกอบด้วยไฟล์. asp ที่มีการเปลี่ยนแปลงนับพันรายการ ฉันจะทำสิ่งนั้นได้ไหม

7
มันเป็นกลิ่นรหัสที่จะตั้งค่าสถานะในวงเพื่อใช้ในภายหลัง?
ฉันมีรหัสบางส่วนที่ฉันทำซ้ำแผนที่จนกว่าเงื่อนไขบางอย่างจะเป็นจริงและต่อมาก็ใช้เงื่อนไขนั้นเพื่อทำบางสิ่งเพิ่มเติม ตัวอย่าง: Map&lt;BigInteger, List&lt;String&gt;&gt; map = handler.getMap(); if(map != null &amp;&amp; !map.isEmpty()) { for (Map.Entry&lt;BigInteger, List&lt;String&gt;&gt; entry : map.entrySet()) { fillUpList(); if(list.size() &gt; limit) { limitFlag = true; break; } } } else { logger.info("\n&gt;&gt;&gt;&gt;&gt; \n\t 6.1 NO entries to iterate over (for given FC and target) \n"); } if(!limitFlag) …

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