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

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

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

15
ทำไมเรามีการเพิ่ม postfix?
ข้อจำกัดความรับผิดชอบ : ฉันรู้ดีว่าความหมายของคำนำหน้าและการเพิ่มคำนำหน้า ดังนั้นโปรดอย่าอธิบายให้ฉันฟังว่ามันทำงานอย่างไร การอ่านคำถามเกี่ยวกับการโอเวอร์โฟลว์ของสแต็คฉันไม่สามารถช่วยได้ แต่สังเกตว่าโปรแกรมเมอร์สับสนโดยผู้ประกอบการเพิ่ม postfix ซ้ำแล้วซ้ำอีก จากคำถามนี้จะเกิดขึ้น: มีกรณีการใช้งานใดบ้างที่การเพิ่ม postfix ให้ประโยชน์ที่แท้จริงในแง่ของคุณภาพของรหัส? ให้ฉันอธิบายคำถามของฉันด้วยตัวอย่าง นี่คือการใช้งานแบบย่อของstrcpy: while (*dst++ = *src++); แต่นั่นไม่ใช่รหัสการจัดทำเอกสารด้วยตัวเองที่แน่นอนที่สุดในหนังสือของฉัน (และมันสร้างคำเตือนที่น่ารำคาญสองประการในคอมไพเลอร์สติ) ดังนั้นมีอะไรผิดปกติกับทางเลือกต่อไปนี้? while (*dst = *src) { ++src; ++dst; } จากนั้นเราสามารถกำจัดการมอบหมายที่สับสนในสภาพและรับรหัสที่ไม่มีการเตือนอย่างสมบูรณ์: while (*src != '\0') { *dst = *src; ++src; ++dst; } *dst = '\0'; (ใช่ฉันรู้srcและdstจะมีค่าสิ้นสุดที่แตกต่างกันในโซลูชันทางเลือกเหล่านี้ แต่เนื่องจากstrcpyผลตอบแทนทันทีหลังจากลูปจึงไม่สำคัญในกรณีนี้) ดูเหมือนว่าจุดประสงค์ของการเพิ่ม postfix คือการสร้างโค้ดให้สั้นที่สุด ฉันเพียงแค่ล้มเหลวที่จะเห็นว่านี่คือสิ่งที่เราควรพยายาม …
55 c++  c  postfix 

12
หมายเลขบิลด์ใน MAJOR.MINOR.BUILDNUMBER.REVISION คืออะไร
สิ่งที่ฉันคิดเกี่ยวกับ Build Numbers คือเมื่อใดก็ตามที่สร้างบิลด์ใหม่ทุกคืนบิลด์ใหม่จะถูกสร้างและกำหนดให้กับบิลด์นั้น ดังนั้นสำหรับแอปพลิเคชันเวอร์ชัน 7.0 ของฉันบิลด์บิลด์ต่อคืนจะเป็น 7.0.1, 7.0.2 เป็นต้น มันเป็นอย่างนั้นเหรอ? ถ้าเช่นนั้นการใช้ REVISION หลังจากหมายเลขบิลด์คืออะไร? หรือว่าส่วนการปรับปรุงจะเพิ่มขึ้นหลังจากการสร้างทุกคืน? ฉันสับสนเล็กน้อยที่นี่ ... เราจะอ้างถึงยามค่ำคืนสร้างแต่ละเป็นBUILD ? รูปแบบที่กล่าวถึงที่นี่: AssemblyVersion - MSDN

13
คุณเคยมีส่วนร่วมในการเขียนใหญ่หรือไม่? [ปิด]
Joel Spolskyพูดถึงหนึ่งในกระทู้ที่โด่งดังของเขา: ความผิดพลาดเชิงกลยุทธ์ครั้งเดียวที่เลวร้ายที่สุดที่ บริษัท ซอฟต์แวร์รายใดสามารถทำได้: เขียนโค้ดใหม่อีกครั้งตั้งแต่เริ่มต้น Chad Fowlerเขียนว่า: คุณเคยเห็นวิดีโอโพสต์ในเว็บบล็อกและโฆษณาและคุณตัดสินใจว่าคุณจะนำผลิตภัณฑ์ของคุณไปใช้ใหม่ใน Rails (หรือ Java หรือ. NET หรือ Erlang เป็นต้น) ระวัง. นี่เป็นเส้นทางที่ยาวกว่าหนักกว่าและมีแนวโน้มที่จะเกิดความล้มเหลวมากกว่าที่คุณคาดไว้ คุณเคยมีส่วนร่วมในการเขียนใหญ่หรือไม่? ฉันสนใจประสบการณ์ของคุณเกี่ยวกับหัวข้อที่น่าสลดใจนี้และโดยเฉพาะอย่างยิ่งในการเขียนครั้งใหญ่ที่เสร็จสมบูรณ์แล้ว (ถ้ามี)
55 rewrite 

14
วิธีที่มีประสิทธิภาพในการแนะนำความคล่องตัวสู่สถานที่ทำงานหรือไม่?
จากประสบการณ์ของคุณ (ข้อมูลเล็ก ๆ น้อย ๆ หรืออื่น ๆ ) อะไรคือวิธีที่มีประสิทธิภาพในการแนะนำ Agile ให้กับองค์กรหรือ บริษัท ที่ไม่คล่องตัว ปรับปรุง: ใครสามารถพูดคุยกับกรณีที่คุณพยายามที่จะแนะนำ Agile แต่คุณ "ถูกยิง" ตอนนี้คุณมีความเข้าใจย้อนหลังบ้างไหมว่าทำไมคุณถึง "ถูกยิง"?

17
การตรวจสอบรหัสเป็นเรื่องส่วนตัวหรือวัตถุประสงค์ (เชิงปริมาณ) หรือไม่
ฉันกำลังรวบรวมแนวทางสำหรับการตรวจสอบโค้ด เรายังไม่มีกระบวนการที่เป็นทางการและกำลังพยายามทำให้เป็นระเบียบ และทีมของเรามีการกระจายทางภูมิศาสตร์ เราใช้TFSสำหรับการควบคุมแหล่งข้อมูล (เราใช้สำหรับการติดตามงาน / ข้อบกพร่อง / การจัดการโครงการเช่นกัน แต่เราย้ายข้อมูลไปยังJIRA ) ด้วย Visual Studio 2008 เพื่อการพัฒนา สิ่งที่คุณมองหาเมื่อทำการตรวจสอบรหัสคืออะไร? นี่คือสิ่งที่ฉันคิดขึ้นมา บังคับใช้กฎFxCop (เราเป็นร้านค้าของ Microsoft) ตรวจสอบประสิทธิภาพ (เครื่องมือใด ๆ ) และความปลอดภัย (คิดถึงการใช้ OWASP - โปรแกรมรวบรวมข้อมูลโค้ด ) และความปลอดภัยของเธรด ยึดมั่นในการตั้งชื่ออนุสัญญา รหัสควรครอบคลุมกรณีขอบและเงื่อนไขขอบเขต ควรจัดการข้อยกเว้นอย่างถูกต้อง (อย่ากลืนข้อยกเว้น) ตรวจสอบว่าการทำงานซ้ำซ้อนที่อื่นหรือไม่ ร่างกายวิธีการควรมีขนาดเล็ก (20-30 บรรทัด) และวิธีการควรทำสิ่งหนึ่งและสิ่งเดียวเท่านั้น (ไม่มีผลข้างเคียงและหลีกเลี่ยงการมีเพศสัมพันธ์ชั่วคราว -) ห้ามส่ง / คืนค่า null ในเมธอด หลีกเลี่ยงรหัสที่ตายแล้ว เอกสารสาธารณะและวิธีการป้องกัน …

12
ถือว่าเป็นการใช้งาน PHP ที่ไม่ดีหรือไม่
หลายต่อหลายครั้งบนเว็บไซต์นี้ฉันเห็นคนพยายามทำสิ่งนี้: <script type="text/javascript"> $(document).ready(function(){ $('<?php echo $divID ?>').click(funtion(){ alert('do something'); }); }); </script> ฉันไม่คิดว่านี่เป็นรูปแบบที่ผู้คนตกอยู่ในความเป็นจริง ต้องมีบทเรียนหรือสื่อการเรียนรู้ที่แสดงสิ่งนี้มิฉะนั้นเราจะไม่เห็นมันมากนัก สิ่งที่ฉันถามคือฉันกำลังทำเรื่องนี้มากเกินไปหรือเป็นการปฏิบัติที่เลวร้ายจริง ๆ ? แก้ไข: ได้ พูดคุยกับเพื่อนของฉันเกี่ยวกับเรื่องนี้ที่มักจะใส่ทับทิมใน JavaScript ของเขาและเขานำประเด็นนี้ขึ้นมา การวางค่าคงที่ของแอพพลิเคชั่นในจาวาสคริปต์ของคุณนั้นเป็นแบบไดนามิกหรือไม่ดังนั้นคุณไม่ต้องแก้ไขสองไฟล์ ตัวอย่างเช่น... MYAPP.constants = <php echo json_encode($constants) ?>; ยังเป็นการตกลงที่จะเข้ารหัสข้อมูลที่คุณวางแผนที่จะใช้ในไลบรารีโดยตรง ChartLibrary.datapoints = <php echo json_encode($chartData) ?>; หรือเราควรโทร AJAX ทุกครั้ง?

6
วิธีจัดการกับความกลัวในการพึ่งพา
ทีมของฉันในการสร้างส่วนประกอบที่พันธมิตรของ บริษัท สามารถใช้เพื่อรวมเข้ากับแพลตฟอร์มของเรา ดังนั้นฉันเห็นด้วยที่เราควรใช้ความระมัดระวังเป็นอย่างยิ่งเมื่อแนะนำบุคคลที่สาม (อ้างอิง) ขณะนี้เราไม่มีการพึ่งพาของบุคคลที่สามและเราต้องอยู่ในระดับ API ต่ำสุดของกรอบงาน ตัวอย่างบางส่วน: เราถูกบังคับให้อยู่ในระดับ API ต่ำสุดของกรอบงาน (. NET Standard) เหตุผลเบื้องหลังสิ่งนี้คือว่าแพลตฟอร์มใหม่อาจมาถึงวันหนึ่งที่รองรับเฉพาะระดับ API ที่ต่ำมากเท่านั้น เราได้ดำเนินการส่วนประกอบของเราเองสำหรับ (de) การทำให้เป็นอันดับ JSON และอยู่ในกระบวนการของการทำเช่นเดียวกันสำหรับ JWT สิ่งนี้มีอยู่ในเฟรมเวิร์ก API ที่สูงขึ้น เราได้นำ wrapper ไปใช้กับเฟรมเวิร์ก HTTP ของไลบรารี่มาตรฐานเพราะเราไม่ต้องการพึ่งพาการใช้ HTTP ของไลบรารี่มาตรฐาน รหัสทั้งหมดสำหรับการจับคู่กับ / จาก XML ถูกเขียน "ด้วยมือ" อีกครั้งด้วยเหตุผลเดียวกัน ฉันรู้สึกว่าเรากำลังจะไปไกลเกินไป ฉันสงสัยว่าจะจัดการกับเรื่องนี้อย่างไรตั้งแต่นี้ฉันคิดว่าสิ่งนี้มีผลกระทบอย่างมากต่อความเร็วของเรา

10
เมื่อใดที่คุณจะใช้ ID สตริงยาวแทนที่จะเป็นจำนวนเต็มอย่างง่าย [ปิด]
ฉันต้องการที่จะใช้ Youtube เป็นตัวอย่าง: PEckzwggd78พวกเขาใช้รหัสในรูปแบบของ ทำไมพวกเขาถึงไม่ใช้จำนวนเต็มอย่างง่าย? หรือ imgur.com - พวกเขายังใช้ ID เช่น9b6tMZSรูปภาพและแกลเลอรี่ ไม่ใช่จำนวนเต็มตามลำดับ ทำไมพวกเขาไม่ใช้จำนวนเต็ม (โดยเฉพาะอย่างยิ่งลำดับ) ในสิ่งที่กรณีมันคือการตัดสินใจที่ชาญฉลาดในการใช้รหัสสตริงดังกล่าวแทนจำนวนเต็ม?

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

6
ฟังก์ชั่นโดยไม่ได้ตั้งใจทำให้พารามิเตอร์อ้างอิง - สิ่งที่ผิดพลาด?
วันนี้เราพบสาเหตุของข้อผิดพลาดที่น่ารังเกียจที่เกิดขึ้นเป็นระยะ ๆ ในบางแพลตฟอร์มเท่านั้น ต้มโค้ดของเราออกมาเป็นแบบนี้: class Foo { map<string,string> m; void A(const string& key) { m.erase(key); cout << "Erased: " << key; // oops } void B() { while (!m.empty()) { auto toDelete = m.begin(); A(toDelete->first); } } } ปัญหาอาจดูเหมือนชัดเจนในกรณีที่ง่ายนี้: Bผ่านการอ้างอิงถึงคีย์Aซึ่งจะลบรายการแผนที่ก่อนที่จะพยายามพิมพ์ (ในกรณีของเรามันก็ไม่ได้พิมพ์ แต่ใช้ในทางที่ซับซ้อนมากขึ้น) นี้เป็นหลักสูตรที่ไม่ได้กำหนดพฤติกรรมเนื่องจากมีการอ้างอิงห้อยหลังจากการเรียกร้องให้keyerase แก้ไขครั้งนี้เป็นที่น่ารำคาญ - เราเพิ่งเปลี่ยนประเภทพารามิเตอร์จากไปconst string& stringคำถามคือเราจะหลีกเลี่ยงข้อผิดพลาดนี้ได้ตั้งแต่แรกอย่างไร? ดูเหมือนว่าทั้งสองฟังก์ชั่นทำในสิ่งที่ถูกต้อง: Aไม่มีทางรู้ว่าkeyหมายถึงสิ่งที่มันกำลังจะทำลาย …
54 c++ 

3
ฉันควรใช้รหัสสถานะ HTTP เพื่ออธิบายเหตุการณ์ระดับแอปพลิเคชัน
เซิร์ฟเวอร์จำนวนมากที่ฉันจัดการจะส่งคืน HTTP 200 สำหรับคำขอที่ลูกค้าควรพิจารณาถึงความล้มเหลวโดยมี 'ความสำเร็จ: เท็จ' ในเนื้อความ ดูเหมือนว่าฉันจะใช้รหัส HTTP ไม่ถูกต้องกับฉันโดยเฉพาะในกรณีของการตรวจสอบสิทธิ์ที่ล้มเหลว ฉันได้อ่านรหัสข้อผิดพลาด HTTP โดยสังเขปแล้วสรุปว่า '4xx' บ่งชี้ว่าไม่ควรทำคำขออีกครั้งจนกว่าจะมีการเปลี่ยนแปลงในขณะที่ '5xx' แสดงว่าคำขอนั้นอาจจะใช้งานได้หรืออาจไม่ถูกต้อง แต่ก็ไม่สำเร็จ ในกรณีนี้ 200: การเข้าสู่ระบบล้มเหลวหรือ 200: ไม่พบไฟล์นั้นหรือ 200: พารามิเตอร์ที่หายไป x ดูเหมือนผิดปกติ ในทางกลับกันฉันเห็นการโต้แย้งว่า '4xx' ควรระบุปัญหาเชิงโครงสร้างของคำขอเท่านั้น ดังนั้นจึงเหมาะสมที่จะส่งคืน 200: ผู้ใช้ / รหัสผ่านไม่ดีแทนที่จะได้รับอนุญาต 401 เนื่องจากลูกค้าได้รับอนุญาตให้ทำการร้องขอ แต่มันเกิดขึ้นไม่ถูกต้อง อาร์กิวเมนต์นี้สามารถสรุปได้ว่าหากเซิร์ฟเวอร์สามารถประมวลผลคำขอและตัดสินใจได้ทั้งหมดรหัสการตอบสนองควรเป็น 200 และขึ้นอยู่กับลูกค้าที่จะตรวจสอบเนื้อหาสำหรับข้อมูลเพิ่มเติม โดยทั่วไปดูเหมือนว่าจะเป็นเรื่องของการตั้งค่า แต่นั่นไม่น่าพอใจดังนั้นถ้าใครมีเหตุผลว่าทำไมหนึ่งในกระบวนทัศน์เหล่านี้ถูกต้องมากขึ้นฉันอยากจะรู้

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

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

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

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