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

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

19
โปรแกรมเมอร์ในภาคตะวันออกมองเห็นโปรแกรมเมอร์ในตะวันตกได้อย่างไร
อีกครึ่งหนึ่งของคำถามนี้: โปรแกรมเมอร์ในเวสต์เห็นโปรแกรมเมอร์ในตะวันออกได้อย่างไร ฉันคิดว่ามันน่าสนใจและสำคัญมากที่จะเห็นว่าโปรแกรมเมอร์ในภาคตะวันออกมองโปรแกรมเมอร์ในทิศตะวันตกอย่างไร ส่วนทางตะวันออกของโลก (อินเดีย / จีน / ฟิลิปปินส์) มักถูกมองว่าเป็นการให้บริการเอาท์ซอร์สไปยังโลกตะวันตก (สหรัฐอเมริกาและยุโรป) เป็นหลัก คุณมีประสบการณ์ในการทำงานเป็นส่วนหนึ่งของทีมต่างประเทศหรือไม่? ถ้าใช่มันเป็นอย่างไร คุณมีความคิดทั่วไปหรือความคิดเห็นเกี่ยวกับโปรแกรมเมอร์จากตะวันตก (เช่นร่วมมือกันส่งตรงเวลาหรือทำงานคุณภาพหรือไม่)
89 teamwork  culture 

26
คณิตศาสตร์เกี่ยวข้องกับการเขียนโปรแกรมอย่างไร [ปิด]
ฉันเพิ่งเริ่มต้นอนุปริญญาด้านการพัฒนาซอฟต์แวร์ ตอนนี้เรากำลังเริ่มต้นด้วย Java พื้นฐานและเช่นนั้น (จากด้านล่างคุณอาจจะพูด) ซึ่งก็ดีฉันไม่มีประสบการณ์การเขียนโปรแกรมนอกเหนือจากการรู้วิธีทำ "Hello World" ใน Java ฉันได้ยินอยู่เสมอว่าคณิตศาสตร์เกี่ยวข้องกับการเขียนโค้ด แต่มันเป็นอย่างไร ตัวอย่างทั่วไปอะไรที่จะแสดงให้เห็นว่าคณิตศาสตร์และการเขียนโปรแกรมไปด้วยกันหรือพึ่งพาซึ่งกันและกัน? ฉันขอโทษสำหรับคำถามของฉันที่คลุมเครือฉันแทบจะไม่ได้เริ่มคิดอย่างคร่าว ๆ เกี่ยวกับโลกที่ฉันกำลังก้าวเข้าสู่การเป็นนักเรียนลิงรหัส ...

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

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

6
เหตุใดบางโปรแกรม C เขียนในไฟล์ต้นฉบับขนาดใหญ่?
ตัวอย่างเช่นเครื่องมือSysInternals "FileMon" จากอดีตมีไดรเวอร์โหมดเคอร์เนลที่มีซอร์สโค้ดทั้งหมดในไฟล์ 4,000 บรรทัด เช่นเดียวกันสำหรับโปรแกรม ping แรกที่เคยเขียน (~ 2,000 LOC)
88 design  c  source-code 

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

7
การประเมินการลัดวงจรมันเป็นการปฏิบัติที่ไม่ดีเหรอ?
สิ่งที่ฉันรู้จักมาระยะหนึ่ง แต่ไม่เคยพิจารณามาก่อนคือภาษาส่วนใหญ่มีความเป็นไปได้ที่จะให้ความสำคัญกับผู้ประกอบการในคำสั่ง if ตามคำสั่งของพวกเขา ฉันมักจะใช้สิ่งนี้เป็นวิธีในการป้องกันข้อยกเว้นอ้างอิงเป็นโมฆะเช่น: if (smartphone != null && smartphone.GetSignal() > 50) { // Do stuff } ในกรณีนี้รหัสจะส่งผลในการตรวจสอบครั้งแรกว่าวัตถุไม่เป็นโมฆะและจากนั้นใช้วัตถุนี้รู้ว่ามันมีอยู่ ภาษานั้นฉลาดเพราะรู้ว่าถ้าคำสั่งแรกถ้าเป็นเท็จก็ไม่มีประโยชน์ที่จะประเมินคำสั่งที่สองและดังนั้นจึงไม่มีข้อยกเว้นการอ้างอิงโมฆะ สิ่งนี้ใช้งานได้เหมือนกันสำหรับตัวดำเนินการandและor สิ่งนี้มีประโยชน์ในสถานการณ์อื่น ๆ เช่นการตรวจสอบว่าดัชนีอยู่ในขอบเขตของอาเรย์และเทคนิคดังกล่าวสามารถทำได้ในหลายภาษาตามความรู้ของฉัน: Java, C #, C ++, Python และ Matlab คำถามของฉันคือ: รหัสประเภทนี้เป็นตัวแทนของการปฏิบัติที่ไม่ดีหรือไม่? การปฏิบัติที่ไม่ดีนี้เกิดขึ้นจากปัญหาทางเทคนิคที่ซ่อนอยู่หรือไม่ (เช่นนี้อาจส่งผลให้เกิดข้อผิดพลาด) หรือนำไปสู่ปัญหาความสามารถในการอ่านสำหรับโปรแกรมเมอร์อื่น ๆ หรือไม่? มันอาจสร้างความสับสนได้ไหม

2
โรงเรียน TDD ในลอนดอนและชิคาโกมีอะไรบ้าง?
ฉันเคยได้ยินเกี่ยวกับสไตล์ลอนดอนเทียบกับสไตล์ชิคาโก (บางครั้งเรียกว่าสไตล์ดีทรอยต์) ของการทดสอบการพัฒนาขับเคลื่อน (TDD) การประชุมเชิงปฏิบัติการของกลุ่มผู้ใช้ Utah Extreme Programming: สไตล์การโต้ตอบ TDD เรียกอีกอย่างว่าสไตล์ mockistหรือสไตล์ลอนดอนหลังจากคลับ Extreme Tuesday ของกรุงลอนดอนซึ่งเป็นที่นิยม มันมักจะแตกต่างกับดีทรอยต์สไตล์หรือคลาสสิก TDD ซึ่งเป็นรัฐมากขึ้น การประชุมเชิงปฏิบัติการ Jason Gorman : การประชุมเชิงปฏิบัติการครอบคลุมทั้งโรงเรียนชิคาโกของ TDD (รัฐตามการทดสอบพฤติกรรมและรูปสามเหลี่ยม) และโรงเรียนในกรุงลอนดอนซึ่งมุ่งเน้นเพิ่มเติมเกี่ยวกับการทดสอบการทำงานร่วมกันเยาะเย้ยและ TDD แบบ end-to-end โดยเน้นเฉพาะในการออกแบบความรับผิดชอบขับเคลื่อนและบอกว่าอย่าถามวิธีการOOเมื่อเร็ว ๆ นี้ได้รับความนิยมอีกครั้งโดย Steve Freeman's และ Nat Pryce's Software ที่มุ่งเน้นการเติบโตเชิงวัตถุที่แนะนำโดยการทดสอบหนังสือ โพสต์Classic TDD หรือ "London School"? โดย Jason Gorman มีประโยชน์ แต่ตัวอย่างของเขาทำให้ฉันสับสนเพราะเขาใช้สองตัวอย่างที่แตกต่างกันแทนที่จะเป็นตัวอย่างหนึ่งที่มีทั้งสองวิธี ความแตกต่างคืออะไร? …
88 tdd  concepts 

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

9
การพัฒนาความคิดมากกว่า
ฉันทำงานเป็นนักพัฒนาแอพมาเป็นเวลาหนึ่งปีครึ่งแล้ว (ไม่นานฉันก็รู้) และฉันเพิ่งได้รับโครงการใหญ่ครั้งแรกของฉัน ไม่จำเป็นต้องบอกว่ามันไม่ได้ราบรื่นมากดังนั้นฉันจึงขอคำแนะนำจากโปรแกรมเมอร์อาวุโสที่เกี่ยวข้องในโครงการเกี่ยวกับวิธีการเข้าถึง เขาบอกว่าฉันคิดมากที่จะทำภารกิจนี้และเพราะฉันไม่เคยจัดการโครงการขนาดนี้ก่อนที่ฉันจะใช้เวลามากเกินไปในการคิดรูปแบบการออกแบบ ในคำพูดที่ฉลาดของเขาเขาบอกฉันว่า "F * ck อนาคตสร้างเพื่อตอนนี้" นี่คือโปรแกรมเมอร์ทั่วไปที่ตามมาเมื่อทำโครงการเช่นนี้หรือไม่? ตัวอย่างเช่นหากคุณได้รับการขอให้พิสูจน์แบบจำลองแนวคิดมันเป็นแนวโน้มทั่วไปที่จะทำให้ตัวอย่างที่ใช้การได้ออกมาเร็วที่สุดหรือไม่? แก้ไข: เนื่องจากการถกเถียงเรื่องนี้เป็นประกายฉันอยากจะพูดถึงว่าสถานการณ์นี้รุนแรงมาก: เรามีกำหนดเวลาที่แน่นมากเนื่องจากปัจจัยที่อยู่เหนือการควบคุมของเรา (เช่นตลาดที่เราตั้งเป้าหมายไว้จะหมดความสนใจถ้าเราไม่ ไม่ต้องแสดงให้พวกเขาเห็น) และคำแนะนำของเขาพิสูจน์แล้วว่ามีประสิทธิภาพมากสำหรับงานนี้โดยเฉพาะ

17
การกำหนดรูปแบบรหัสเดียวกันสำหรับนักพัฒนาทั้งหมดเป็นความคิดที่ดีหรือไม่
เรากำลังพิจารณาที่จะกำหนดรูปแบบรหัสมาตรฐานเดียวในโครงการของเรา (รูปแบบอัตโนมัติพร้อมการดำเนินการบันทึกใน Eclipse) เหตุผลคือในปัจจุบันมีความแตกต่างอย่างมากในรูปแบบรหัสที่ใช้โดยนักพัฒนา (> 10) ซึ่งทำให้นักพัฒนารายหนึ่งทำงานกับโค้ดของผู้พัฒนารายอื่นได้ยากขึ้น บางครั้งไฟล์ Java เดียวกันใช้รูปแบบที่ต่างกัน 3 รูปแบบ ดังนั้นฉันเชื่อว่าข้อได้เปรียบนั้นชัดเจน (readability => การเพิ่มผลผลิต) แต่เป็นความคิดที่ดีที่จะกำหนดสิ่งนี้หรือไม่? และถ้าไม่ทำไม? อัพเดท เราทุกคนใช้ Eclipse และทุกคนตระหนักถึงแผน มีรูปแบบรหัสที่ใช้โดยส่วนใหญ่แล้ว แต่ไม่ได้บังคับใช้เนื่องจากบางคนชอบที่จะยึดตามรูปแบบรหัสของตัวเอง เนื่องจากเหตุผลข้างต้นบางคนต้องการบังคับใช้

15
Tricky logic puzzles - พวกเขามีประโยชน์จริง ๆ ในการประเมินทักษะการเขียนโปรแกรมหรือไม่? [ปิด]
ในการสัมภาษณ์ครั้งล่าสุดที่ฉันเข้าร่วมฉันถูกขอให้ไขปริศนาที่ฉันคาดว่าจะวัดปริมาณน้ำ blah ลิตรอย่างแม่นยำโดยให้ถังสองถังที่มีความจุ - blah และ blah ลิตรตามลำดับ ฉันไม่สามารถไขปริศนาได้ในเวลาที่กำหนด (~ 5 นาที) ผู้สัมภาษณ์รู้สึกผิดหวังเล็กน้อยและกล่าวว่าโปรแกรมเมอร์ต้องมีทักษะ "เหล่านี้" ฉันไม่เข้าใจทักษะที่เขาพูดถึง ฉันมักจะรู้สึกแปลก ๆ เกี่ยวกับปริศนาประเภทนี้ที่มักถูกถามในการสัมภาษณ์งานเขียนโปรแกรม ฉันไม่เข้าใจว่าอะไรคือความเชื่อมโยงระหว่างตัวต่อและการเขียนโปรแกรม ผู้สัมภาษณ์ตั้งใจจะประเมินทักษะตัวต่อแบบใดกันแน่

17
คุณรับมือกับโค้ดที่น่าเกลียดที่คุณเขียนได้อย่างไร [ปิด]
ดังนั้นลูกค้าของคุณขอให้คุณเขียนรหัสเพื่อให้คุณทำ จากนั้นเขาก็เปลี่ยนสเปคของคุณตามที่คาดไว้และคุณจะใช้คุณสมบัติใหม่ของเขาอย่างขยันขันแข็งอย่างเด็กน้อย ยกเว้น ... ฟีเจอร์ใหม่ที่ขัดแย้งกับฟีเจอร์เก่าดังนั้นตอนนี้โค้ดของคุณยุ่งเหยิง คุณจริงๆต้องการที่จะกลับไปแก้ไขมัน แต่เขาช่วยให้ขอสิ่งใหม่ ๆ และเวลาที่คุณเสร็จสิ้นการทำความสะอาดสิ่งที่ทุกคนจะลมขึ้นเป็นระเบียบอีกครั้ง คุณทำอะไร? หยุดการเป็นโรค OCD และเพียงยอมรับว่ารหัสของคุณกำลังยุ่งเหยิงไม่ว่าคุณจะทำอะไร บันทึกการทำความสะอาดสำหรับรุ่น 2 หรือไม่

28
ความสำคัญของ JavaScript ที่ลดลงอย่างสง่างามเป็นอย่างไร?
นักพัฒนาเว็บควรใช้ความพยายามอย่างต่อเนื่องในการปรับปรุงเว็บแอปพลิเคชันของเราด้วย JavaScript เพื่อให้มั่นใจว่าคุณลักษณะดังกล่าวจะลดระดับลงอย่างงดงามจึงมั่นใจได้ว่าสามารถเข้าถึงได้หรือไม่ หรือเราควรใช้เวลานั้นมุ่งเน้นไปที่คุณสมบัติใหม่หรือการพัฒนาด้านอื่น ๆ ? ข้อความย่อยของคำถามนั้นคือ: ลูกค้า / ลูกค้า / ผู้ใช้ของเราใช้เว็บไซต์หรือแอปพลิเคชันของเราจำนวนเท่าใดเมื่อปิดใช้งาน JavaScript คุณมีโครงการที่มีข้อกำหนดที่ต้องการฟังก์ชั่นจาวาสคริปต์โดยเฉพาะ (เกือบทั้งหมดของฉันจะทำ) และข้อกำหนดเหล่านั้นต้องการการย่อยสลายที่สง่างามหรือไม่? เพื่อประโยชน์ในการถามคำถามนี้ฉันดึง programmers.stackexchange.com ขึ้นมาโดยไม่เปิดใช้งาน JavaScript และฉันได้รับการต้อนรับด้วยข้อความนี้: "โปรแกรมเมอร์ - Stack Exchange ทำงานได้ดีที่สุดเมื่อเปิดใช้งาน JavaScript" มันเป็นเรื่องยากที่จะเข้าสู่ระบบแม้ว่าเว็บไซต์ดูเหมือนจะทำงานได้ดี (ฉันไม่สามารถลงคะแนนคำถามใด ๆ ) ฉันคิดว่านี่เป็นวิธีการพัฒนาที่น่าพอใจ ลองนึกภาพความพยายามที่เกี่ยวข้องในการทำให้คุณสมบัติทั้งหมดของไซต์ใช้งานได้กับ HTML ธรรมดาและตรรกะฝั่งเซิร์ฟเวอร์ ในทางกลับกันฉันสงสัยว่าผู้ใช้หลายคนมีความแปลกแยกจากวิธีการนี้ เราทุกคนได้รับการฝึกอบรม (อย่างน้อยก็เป็นนักพัฒนาที่ดีในหมู่พวกเรา) เพื่อใช้การเพิ่มประสิทธิภาพแบบก้าวหน้าและเพื่อให้แน่ใจว่าฟีเจอร์ไดนามิกของเว็บแอปพลิเคชันของเราจะลดลงอย่างงดงาม การปรับปรุงที่ก้าวหน้านี้เป็นเพียงความตื่นเต้นหรือลูกค้าของเราบางคนใช้บริการเว็บบางอย่างโดยไม่ใช้ JavaScript หรือไม่

30
คุณต้องการมีฟีเจอร์อะไรใน PHP? [ปิด]
เนื่องจากเป็นช่วงเทศกาลวันหยุดและทุกคนต้องการสิ่งนี้ฉันสงสัย - ฟีเจอร์ภาษาที่คุณต้องการจะเพิ่มใน PHP คืออะไร? ฉันสนใจคำแนะนำ / ความปรารถนาที่เป็นประโยชน์สำหรับภาษานี้ โดยการปฏิบัติฉันหมายถึง: สิ่งที่สามารถทำได้ในทางปฏิบัติ (ไม่ใช่: "ฉันหวังว่า PHP จะเดาว่ารหัสของฉันหมายถึงอะไรและแก้ไขข้อบกพร่องสำหรับฉัน" หรือ "ฉันหวังว่าโค้ดใด ๆ จะทำงานภายใต้ 5ms") บางสิ่งที่ไม่ต้องการเปลี่ยน PHP เป็นภาษาอื่น (ไม่ใช่: "ฉันหวังว่าพวกเขาจะลบเครื่องหมาย $ และใช้พื้นที่แทนวงเล็บปีกกา" หรือ "ฉันหวังว่า PHP ถูกคอมไพล์พิมพ์แบบสแตติกและมี # อยู่ในชื่อ") สิ่งที่ไม่ต้องการทำลายรหัสที่มีอยู่ทั้งหมด (ไม่ใช่: "ลองเปลี่ยนชื่อ 500 ฟังก์ชั่นและเปลี่ยนลำดับพารามิเตอร์สำหรับพวกเขา") สิ่งที่ไม่เปลี่ยนภาษาหรือบางแง่มุมที่น่าสนใจของมัน (ไม่ได้ "ผมต้องการมีส่วนขยายเพื่อรองรับการ XYZ โปรโตคอล" หรือ "ฉันหวังว่าข้อผิดพลาด # 12345 ได้รับการแก้ไขในที่สุด") บางสิ่งที่มากกว่าคำพูดโวยวาย (ไม่ใช่: "ฉันหวังว่า …

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