कंप्यूटर विज्ञान की अवधारणाओं को मुझे क्या जानना चाहिए? [बन्द है]


94

कंप्यूटर विज्ञान में कौन सी अवधारणाएँ आपको बेहतर प्रोग्रामर बनाती हैं?

मेरी डिग्री मैकेनिकल इंजीनियरिंग में थी इसलिए एक प्रोग्रामर के रूप में समाप्त हो गया, मैं मूल बातें में थोड़ा कमी है। कुछ मानक CS अवधारणाएँ हैं, जो मैंने हाल ही में सीखी हैं, जिन्होंने मुझे विशेष रूप से जो कुछ कर रही हैं, उसकी बहुत गहरी समझ दी है:

भाषा सुविधाएं

  • संकेत और पुनरावृत्ति (धन्यवाद योएल!)

डेटा संरचनाएं

  • लिंक की गई सूची
  • hashtables

एल्गोरिदम

  • बबल सतस

जाहिर है, इस समय सूची थोड़ी कम है, इसलिए मैं सुझाव के लिए उम्मीद कर रहा था:

  1. मुझे किन अवधारणाओं को समझना चाहिए,
  2. उन्हें अच्छी तरह से समझने के लिए कोई भी अच्छा संसाधन (जैसा कि विकिपीडिया थोड़ा घना और कभी-कभी अकादमिक हो सकता है)।

5
बुलबुला की तरह? जितना हो सके उनसे दूर रहें! बल्कि यह सीखें कि क्विकसॉर्ट / हीप्सोर्ट कैसे काम करते हैं।
कर्रा

18
हाँ बुलबुले सीखो। जानें क्यों है इसका भयानक। अपनी व्यक्तिगत कमजोरियों सहित क्विकॉर्ट्स, मर्जसॉर्ट और बाकी सभी जानें। लेकिन उन्हें उत्पादन कोड में न लिखें: आप जिस भी प्लेटफ़ॉर्म पर हैं, उसके द्वारा दिए गए सॉर्ट फ़ंक्शन को कॉल करें।
ब्रायन

@Roger Pate - +1 आपके लिए, किसी को पता होना चाहिए कि एल्गोरिथ्म या डेटा संरचना किसके लिए अच्छा है, और यह क्या बेकार है। क्वॉर्ट्सॉर्ट और बबल्सॉर्ट दोनों का सबसे खराब मामला प्रदर्शन [O (n ^ 2)] है, लेकिन बहुत भिन्न प्रकार के इनपुट के लिए, और Bubblesort का O (n) का सर्वश्रेष्ठ मामला प्रदर्शन है, जहां QS अभी भी O (n log n) है। बेशक, अगर आप बबल्सर्ट पर विचार कर रहे हैं तो आप इसके बजाय इंसर्शन सॉर्ट के लिए जाना चाह सकते हैं।
आंद्रे आर्टस

जवाबों:


60

स्टीव येजे (पूर्व में अमेज़ॅन, अब Google पर) इस ब्लॉग पोस्ट पर एक नज़र डालें:

यह उन पांच सबसे महत्वपूर्ण अवधारणाओं के बारे में विस्तार से बताता है जिन्हें डेवलपर्स को जानना आवश्यक है:

  1. बुनियादी प्रोग्रामिंग (पुनरावृत्ति, फ़ाइल I / O, स्वरूपित आउटपुट, लूप आदि सहित)
  2. ऑब्जेक्ट ओरिएंटेड डिज़ाइन (डिज़ाइन पैटर्न आदि सहित)। आपको अवधारणाओं को समझने के साथ-साथ समझदार ओओ डिजाइन तैयार करने में सक्षम होना चाहिए।
  3. स्क्रिप्टिंग और regexes।
  4. डेटा संरचनाएं - सूचियां, सेट, हैशटेबल्स, पेड़, ग्राफ, और इसी तरह - साथ ही साथ बिग ओ नोटेशन और एल्गोरिथम जटिलता।
  5. बिट्स, बाइट्स और बाइनरी नंबर - कंप्यूटर के भीतर संख्याओं का प्रतिनिधित्व कैसे किया जाता है, और उन्हें कैसे हेरफेर करना है।

अच्छा लिंक। यूनिक्स की तरफ से थोड़ा सा फोकस किया गया है, (पूरी तरह से गायब है) लेकिन फिर भी अच्छा है।
तून Krijthe

महान लिंक - मेरे लिए काम करने के लिए बहुत कुछ है, मैं बस चाहता हूं कि उन चीजों को समझाने वाले अच्छे पन्नों के कुछ लिंक हों।
जॉन आर्टस

मेरे लिए खुद को जाँचने और मूल सिद्धांतों को पकड़ने के लिए लिंक बहुत उपयोगी होगा। धन्यवाद ..
rpr

सहमत, महान लिंक। हालांकि पहचाने गए संभावित समाधानों में से कई यूनिक्स आधारित हैं, इनमें शामिल समग्र अवधारणाएं बहुत भाषा / प्लेटफ़ॉर्म अज्ञेयवादी हैं। अधिकांश प्रोग्रामर के लिए, एडीआरएस, एडीटी जैसे पेड़, और बिटवाइज़ ऑप्स जैसी चीजें बहुत दुर्लभ हैं, हालांकि वे एक महत्वपूर्ण आधार हैं।
Zach Burlingame

4
मैं regexes को छोड़कर सब कुछ के साथ सहमत हूँ। वे एक अच्छा बोनस हैं, लेकिन अधिकांश सामान जमीनी स्तर की मूल बातें हैं, नींव जिस पर सब कुछ बनाया गया है ... regexes महान हैं, लेकिन मुझे बहुत सारे महान प्रोग्रामर पता हैं जो कभी भी उनका उपयोग नहीं करते हैं, और कभी भी ज़रूरत नहीं है।
बेसका

35

आपको निश्चित रूप से एल्गोरिदम के बिग-ओ नोटेशन और बिग-ओ के अनुमानों को समझना चाहिए - यह क्या है, इसका उपयोग कैसे किया जाता है, यह महत्वपूर्ण क्यों है, आप अपने बिग-ओ के अनुमानों को देखते हुए दो एल्गोरिदम की तुलना कैसे करते हैं, आप बिग-ओ अनुमान कैसे बनाते हैं सरल एल्गोरिदम के लिए।


1
आप मेरे द्वारा लिंक किए गए विकिपीडिया लेख से शुरू कर सकते हैं - यह काफी सरल और गणितीय रूप से सही है।
शार्पट्यूट

3
आपके पास उन्नत गणित की बहुत कम राय होनी चाहिए। मैंने अपने कॉलेज के पहले वर्ष में इसे समझा, जब मैं केवल पथरी के माध्यम से भाग रहा था।
GoatRider

1
एनपी की अवधारणा को मत भूलना और जब कोई समस्या इसके भीतर समाहित होती है, तो एक डेवलपर जो एक खोज उद्देश्य के लिए प्रत्येक डेटाबेस लेनदेन में एक टीएसपी (ट्रैवलिंग सेल्समैन) को कोड करने की कोशिश करता है या कुछ अन्य ऐसी मूर्खता एक बड़ी समस्या है =]
एड जेम्स

2
आपको यह भी पता होना चाहिए कि बड़ा ओ आपको नहीं बताता है कि कौन सा एल्गोरिदम कम समय लेता है। कुछ सबसे सीएस ग्रेड समझ में नहीं आता
मार्टिन बेकेट

3
यह एक तरह का है। यह आपको बताता है कि कौन सा सबसे अच्छा-सबसे खराब मामला है, न कि किसी के साथ जो 'तेज' है जैसा कि इनपुट सेट पर निर्भर करता है।
एड जेम्स

30

मुझे यह थोड़ा अजीब लगता है कि आप कंप्यूटर विज्ञान विषयों की तलाश कर रहे हैं, लेकिन विकिपीडिया को भी अकादमिक: डी

वैसे भी, यहाँ कोई विशेष क्रम में नहीं है:


2
+1 क्योंकि आपने डेटाबेस का उल्लेख किया है, अक्सर इस प्रकार की सूचियों में अनदेखी की जाती है, लेकिन यह जानने के लिए किसी भी अच्छी तरह से गोल सीएस स्नातक के लिए एक बहुत महत्वपूर्ण अवधारणा है।
बजे ब्रायन सुनिश्चित

14

कुछ अवधारणाएँ जिन्होंने मेरे विकास (बुद्धि और कोड) में मदद की:

  • लेक्सिंग, पार्सिंग, स्ट्रिंग मिलान, रेगेक्स
  • Memoization
    • कैप्सूलीकरण / scoping / बंद
    • कैशिंग
  • प्रत्यावर्तन
  • Iterators / जेनरेटर
  • कार्यात्मक प्रोग्रामिंग - जॉन ह्यूज के अद्भुत लेख ने मुझे "क्यों"

ये असतत गणित के पूरे डोमेन हैं, लेकिन सीएस के लिए एक गंभीर परिचय आवश्यक है:

  • मैट्रिक्स / रैखिक बीजगणित
  • ग्राफ सिद्धांत

हालांकि मार्क जेसन-डोमिनस के व्याख्यान और लेख अक्सर पर्ल हैकर्स को निर्देशित किए जाते हैं, मुझे लगता है कि किसी भी प्रोग्रामर को उनकी स्पष्ट प्रस्तुति और वास्तविक कोड से लाभ होगा, विशेष रूप से उच्च आदेश पर्ल में


10

मैं कहूंगा कि आजकल ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की समझ बहुत जरूरी है, भले ही आपको इसे दिन-प्रतिदिन उपयोग करने की आवश्यकता न हो।

इससे मैं यह भी कहूंगा कि सबसे सामान्य पैटर्न को समझने से भी मदद मिल सकती है।


10

मैं सीएस की कई अच्छी अवधारणाओं को पहचानता हूं लेकिन गणित के बारे में बहुत कम बात करता हूं।

मेरा सुझाव है कि आप असतत गणित में देखें । इसमें तार्किक प्रमाण से शुरू होने वाली उपयोगी समस्याओं की एक विस्तृत श्रृंखला है जो आपको कोड में शर्तों को लिखने में मदद करती है। ग्राफ़ सिद्धांत और कॉम्बिनेटरिक्स जटिल समस्या समाधान और एल्गोरिथ्म अनुकूलन के साथ भी मदद करते हैं।

जबकि हम गणित के विषय पर हैं, रैखिक बीजगणित आम तौर पर अग्रिम कंप्यूटर ग्राफिक्स कक्षाओं के लिए एक शर्त है।


1
अगर मुझे केवल एक चुनना पड़ा तो यह असतत गणित होगा। यह बहुत ज्यादा CS 101 है। मुझे सामान्य प्रोग्रामिंग में एक क्षेत्र या प्रतिमान के बारे में सोचने में मुश्किल होती है जिसे किसी तरह से डीएम द्वारा नहीं छुआ जाता है।
आंद्रे आर्टस

6

प्रोग्रामर योग्यता मैट्रिक्स ने इसे विस्तार से कवर किया है, लेकिन मैं एक जोड़े को उजागर करूंगा:

  • डेटा संरचनाएं
    • उन्नत डेटा संरचनाएं जैसे बी-ट्री, बिनोमियल और रिट्रेप्स ढेर, एवीएल / रेड ब्लैक ट्री, सेप्ले ट्री, स्किप लिस्ट, कोशिश आदि।
  • एल्गोरिदम
    • ट्री, ग्राफ, सरल लालची और एल्गोरिदम को विभाजित और जीतना, इस मैट्रिक्स के स्तरों की प्रासंगिकता को समझने में सक्षम है।
  • सिस्टम प्रोग्रामिंग
    • संपूर्ण प्रोग्रामिंग स्टैक, हार्डवेयर (सीपीयू + मेमोरी + कैश + इंटरप्ट + माइक्रोकोड), बाइनरी कोड, असेंबली, स्टैटिक और डायनामिक लिंकिंग, संकलन, व्याख्या, जेआईटी संकलन, कचरा संग्रह, हीप, स्टैक, मेमोरी मेमोरी को समझता है ...
  • स्रोत कोड संस्करण नियंत्रण
    • वितरित वीसीएस प्रणालियों का ज्ञान। ने Bzr / Mercurial / Darcs / Git को आज़माया है
  • स्वचालन का निर्माण
    • सिस्टम बनाने के लिए एक स्क्रिप्ट सेटअप कर सकते हैं और प्रलेखन, इंस्टॉलर, रिलीज़ नोट्स तैयार कर सकते हैं और स्रोत नियंत्रण में कोड को टैग कर सकते हैं
  • स्वचालित परीक्षण
    • समझता है और स्वचालित कार्यात्मक, लोड / प्रदर्शन और UI परीक्षण सेटअप करने में सक्षम है
  • समस्या अपघटन
    • उपयुक्त डेटा संरचनाओं और एल्गोरिदम का उपयोग और जेनेरिक / ऑब्जेक्ट-ओरिएंटेड कोड के साथ आता है जो उस समस्या के पहलुओं को घेरता है जो परिवर्तन के अधीन हैं।
  • सिस्टम अपघटन
    • बाहरी उत्पाद के साथ कई उत्पाद लाइनों और एकीकरण के साथ जटिल प्रणालियों की कल्पना और डिजाइन करने में सक्षम। साथ ही निगरानी, ​​रिपोर्टिंग, असफल ओवर आदि जैसे संचालन सहायता प्रणालियों को डिजाइन करने में सक्षम होना चाहिए।

5

मुझे ग्राफ और कुछ लागू एल्गोरिदम जैसे गहराई पहले, सांस पहले खोज, सबसे छोटे रास्ते आदि बहुत उपयोगी लगते हैं। ऑब्जेक्ट ओरिएंटेशन भी वास्तव में एक सामान्य अवधारणा है।


4

नियम 1: सॉफ्टवेयर नॉलेज कैप्चर है । सॉफ्टवेयर का मतलब कुछ होता है। यदि आप अर्थ पर अस्पष्ट हैं, तो उपयोगकर्ताओं को यह समझने में अधिक समय बिताएं कि वे क्या करते हैं।

एल्गोरिदम और डेटा संरचनाएं एक ही सिक्के के दो पहलू हैं। एल्गोरिथ्म डेटा संरचना पर निर्भर करता है, डेटा संरचना एल्गोरिदम पर निर्भर करता है।

जितनी जल्दी हो सके अनलबल बबल सॉर्ट करें। गंभीरता से। सभी आधुनिक भाषाओं (जावा, पायथन, आदि) में संग्रह कक्षाएं हैं जो बबल सॉर्ट की तुलना में बेहतर सॉर्ट को लागू करती हैं। ऐसी कोई भी परिस्थिति नहीं है जिसके तहत आपको कभी भी किसी चीज़ के लिए बबल सॉर्ट का उपयोग करना चाहिए। आपको एक संग्रह वर्ग की तलाश में होना चाहिए जिसमें एक सॉर्ट विधि शामिल हो। बेहतर है, आपको एक एल्गोरिथ्म की तलाश होनी चाहिए जो पूरी तरह से छंटनी से बचा जाए।

आपको कई भाषाएं सीखनी चाहिए।

  • प्रोग्रामिंग भाषा (जावा, पायथन, आदि)

  • शैल भाषा।

  • डेटाबेस भाषा (SQL)

  • प्रस्तुति भाषाएँ (HTML और CSS)

  • अन्य डेटा प्रतिनिधित्व भाषाएँ (XML, JSON)

आपको कई डेटा संरचनाएं सीखनी चाहिए।

  • अनुक्रम (सूची, ट्यूपल्स, फाइलें)

  • पदानुक्रमित (XML और HTML दस्तावेज़ों के साथ-साथ मूल फ़ाइल सिस्टम)

  • संबंधपरक (डेटाबेस की तरह, और हार्ड और सॉफ्ट लिंक के साथ फाइल सिस्टम)

  • हैश मैप्स और ट्री मैप्स सहित मैप्स (या इंडेक्स या एसोसिएटिव एरे)

  • सेट

प्लस कुछ एल्गोरिथम जटिलता विश्लेषण। कभी-कभी "बिग ओ" कहा जाता है। बबल सॉर्ट खराब क्यों है यह ( एन ^ 2) है, जहां क्विकॉर्ट ( एन लॉग एन ) है।


रिकॉर्ड के लिए, मैं वास्तव में एक बुलबुला सॉर्ट का उपयोग नहीं करूँगा! मुझे बस यह पता चला कि यह एक दिलचस्प अनुभव कैसे काम करता है, और लगा कि कुछ अन्य ऐसे एल्गोरिदम हैं जिन्हें लोगों को अपनी पसंद की भाषा में लिखने के लिए पर्याप्त रूप से समझना चाहिए।
जॉन आर्टस

असंख्य एल्गोरिदम हैं। उनमें से ज्यादातर खराब हैं। उनमें से कुछ अच्छे हैं। बबल सॉर्ट बस खराब है। एल्गोरिदम पर कोई भी पुस्तक खरीदें और आगे बढ़ें।
S.Lott

बस नाइट पिकिंग, लेकिन क्विकॉर्ट सबसे खराब स्थिति हे (एन ^ 2)। मैं इसे केवल इसलिए इंगित करता हूं क्योंकि मुझे लगता है कि यह समझना सही है कि मौलिक एल्गोरिदम का अध्ययन करते समय यह एक मूल्यवान शैक्षिक अभ्यास क्यों है।
ब्रायन

Quicksort के लिए, हाँ - एक महत्वपूर्ण व्यायाम। बबल सॉर्ट के लिए, केवल एक चीज यह देखना है कि एल्गोरिथ्म कितना सही है। सामान्य रूप से विशिष्ट बनाम सबसे खराब स्थिति को समझना महत्वपूर्ण है।
S.Lott

4

खैर अब कीड़े के डिब्बे खुले हैं! :)
मैंने इलेक्ट्रिकल इंजीनियरिंग में शुरुआत की।

रिलेशनल डेटाबेस डिज़ाइन: डेटा पर नज़र रखना "किंडरगार्डन कॉप" में अर्नोल्ड की तरह है।
यह कुल अराजकता हो सकती है। इसे नियंत्रित करना होगा।
जानकारी के सबसे कम दोहराव के साथ, सबसे कम स्थानों पर, अपना डेटा कैसे रखें। अपने डेटा को हल्का कैसे रखें, और आसानी से सुलभ। डेटा वृद्धि और अखंडता को कैसे नियंत्रित किया जाए।

उपयोगकर्ता इंटरफ़ेस (UI) डिज़ाइन: यह है कि उपयोगकर्ता को उस डेटा तक पहुंच प्राप्त करनी चाहिए जिसे हम ट्रैक कर रहे हैं।
अधिकांश UI डेवलपर्स द्वारा डिज़ाइन किए गए हैं। इस प्रकार, अधिकांश यूआई, दुर्भाग्य से, डेटाबेस डिजाइन समानांतर। उपयोगकर्ता डेटा डिज़ाइन के बारे में बिल्कुल भी परवाह नहीं करते हैं। वे बस चाहते हैं, वे क्या चाहते हैं। वे इसे आसानी से प्राप्त करना चाहते हैं। आमतौर पर यह डेटा डिजाइन और यूजर इंटरफेस से अलग होने की मांग करता है। "इंजीनियरिंग" को आप "दक्षिणी-आतिथ्य" से अलग करना सीखें।

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग: कई भाषाएं इस प्रारूप को उबालती हैं।

समानांतर प्रसंस्करण - मल्टी-थ्रेडिंग: कई प्रोसेसर काम को तेज करते हैं!
समानांतर कंप्यूटर दशकों से आसपास हैं। वे पिछले कुछ समय से हमारे डेस्कटॉप पर हैं। "क्लाउड कंप्यूटिंग" की घटना के साथ, बड़े पैमाने पर समानांतर प्रसंस्करण न केवल अनिवार्य है, बल्कि बेहतर भी है। यह अविश्वसनीय रूप से शक्तिशाली है! समानांतर डेवलपर्स के लिए नौकरी की बहुत संभावना है।

व्यावसायिक नियमों को समझना: यह आपको अपने तर्क, तालिका-आधारित बनाने में बहुत मदद करता है।
कई आईफोकल स्थितियां व्यापार नियम तालिकाओं में बैठ सकती हैं। तर्क बदलने के लिए, बस एक तालिका में जानकारी बदलें। थोड़ा / नहीं। थोड़ा / नहीं recompiling।

ईवेंट्स सुपरवाइज़ ... तरीके काम करते हैं:
चीजों को अपने कोड में अलग रखें। इससे भविष्य में दूसरों के लिए अपडेट करना आसान हो जाता है। यह कुछ हद तक मॉडल / व्यू / कंट्रोलर (एमवीसी) ढांचे को समानता देता है।

पी.जे.


3

मेरे लिए मुझे निम्नलिखित पाठ्यक्रम से बहुत कुछ मिला

  • परियोजना प्रबंधन
  • मानव कम्प्यूटर इंटरेक्शन (अधिक उपयोगकर्ता के अनुकूल स्क्रीन बनाने में हमारी मदद करता है)
  • डेटाबेस डिजाइन (डेटाबेस कैसे काम करते हैं, लेन-देन लॉग, लॉकिंग आदि)
  • विवरण भण्डारण
  • ग्राफिक्स (ओपनजीएल)
  • उन्नत एल्गोरिदम
  • डेटा संरचनाएं

मेरी इच्छा है कि मैं वैरिटी में काम करूं

  • संकलक निर्माण
  • डिजाइन पैटर्न्स
  • ऑटोमेटा सिद्धांत

3

लॉजिक - मैं प्रोग्रामिंग में तर्क के महत्व को कम कर देता हूं। आपने कहा कि आपने मैकेनिकल इंजीनियरिंग किया है, इसलिए आपको पता होना चाहिए कि गणित आपके जीवन को कितना आसान बना सकता है।

प्रोपोजल लॉजिक , फर्स्ट-ऑर्डर लॉजिक , सेकंड-ऑर्डर लॉजिक : ये बहुत शक्तिशाली उपकरण हैं। शायद सबसे महत्वपूर्ण (और केवल) महत्वपूर्ण चीजें जो मैंने विश्वविद्यालय में सीखी हैं। लॉजिक एक प्रोग्रामर के भारी तोपखाने की तरह है - बहुत ही जटिल समस्याओं (साथ ही कम जटिल वाले) के बहुत सारे सरल हो जाते हैं जब आप उन्हें एक संगठित, तार्किक रूप में डालते हैं। यह मैकेनिकल इंजीनियर्स के लिए रैखिक बीजगणित क्या है जैसा है।


3

मुझे लगता है कि संकलक कैसे काम करता है, यह जानने की अच्छी समझ है। अहो के पास संकलक बनाने में उपयोग की जाने वाली अवधारणाओं पर क्लासिक पुस्तक है। शीर्षक कंपाइलर है: सिद्धांत, तकनीक और उपकरण। इसका उपनाम ड्रैगन बुक है। उस पुस्तक को वास्तव में समझने के लिए, आपको औपचारिक भाषाओं की समझ होनी चाहिए। होपक्रॉफ्ट की उस पर एक अच्छी किताब है - इंट्रोडक्शन टू ऑटोमेटा थ्योरी, लैंग्वेजेज, एंड कम्प्यूटेशन।


2

2

पहले से ही अच्छी प्रतिक्रियाओं का उल्लेख यहां किया गया है, लेकिन मैं जो महत्वपूर्ण है उसका सबसेट जोड़ना चाहता था, लेकिन अभी तक इसे कवर नहीं किया गया है।

अंडर-अंडर प्रोफेशनल सॉफ्टवेयर डेवलपमेंट के 15 साल बाद, मुझे पता चला कि मैं नियमित रूप से स्कूल में निम्नलिखित कुछ अवधारणाओं का उपयोग करता हूं:

  • सामान्य OO अवधारणाएँ, और आधुनिक प्रोग्रामिंग भाषा सुविधाएँ (कक्षाएं, डेटा छिपाना, आदि)।
  • एल्गोरिदम प्रदर्शन मेट्रिक्स (बिग ओ नोटेशन)। एल्गोरिथ्म को डिजाइन करते समय, एल्गोरिथम की लागत निर्धारित करने के लिए बिग ओ विश्लेषण करते हुए, और टोंटी क्षेत्रों में अधिक कुशल विकल्पों को देखते हुए।
  • लिंक्ड सूची और अन्य जटिल डेटा संरचनाएं।
  • तेजी से छँटाई, और अलग छँटाई अवधारणाओं।
  • पेड़ और तेजी से पेड़ में हेरफेर।

यदि आपकी भाषा / प्लेटफ़ॉर्म कचरा संग्रह का समर्थन नहीं करता है, तो मेमोरी आवंटन और सफाई महत्वपूर्ण हैं, और इसे सूची में जोड़ा जाएगा।


2

मैं गणित को त्याग देता हूं। कंप्यूटर विज्ञान अमूर्त है। गणितज्ञ की तरह सोचना सीखना बहुत मददगार होता है।

मैं भी जोड़ना चाहता था कि S.Lott ने भाषाओं के बारे में क्या कहा। भाषाओं के प्रकारों का एक समूह सीखना भी महत्वपूर्ण है। न सिर्फ संकलित बनाम स्क्रिप्टिंग। लेकिन कार्यात्मक (एमएल, लिस्प, हास्केल) तार्किक (प्रोलोग) वस्तु उन्मुख (सी ++, जावा, स्मॉलटाक) अनिवार्यता (सी, पास्कल, फोरट्रान यहां तक ​​कि)।

जितनी अधिक प्रोग्रामिंग प्रतिमानों को आप जानते हैं, उतनी ही आसान नई भाषाओं को चुनना है जब गर्म नई भाषा आती है!


2

कुछ ओएस अवधारणाएं

 ( memory, IO, Scheduling, process\Threads, multithreading )

[एक अच्छी पुस्तक " मॉडर्न ऑपरेटिंग सिस्टम , दूसरा संस्करण, एंड्रयू एस। तेनबाम"]

कंप्यूटर नेटवर्क का बुनियादी ज्ञान

[ तेनबाम की एक अच्छी किताब

OOPS अवधारणाओं

परिमित ऑटोमेटा

एक प्रोग्रामिंग भाषा (मैंने पहले C को सीखा फिर C ++)

एल्गोरिदम (Time \ space जटिलता, सॉर्ट, खोज, पेड़, लिंक की गई सूची, स्टैक, कतार)

[एक अच्छी पुस्तक का परिचय एल्गोरिदम ]


ऑटो मेटा? - पहले संपादन के अनुसार निश्चित रूप से "ऑटोमेटा"।
टॉम डेयरिंग

ऊप्स! मुझे लगता है कि जादू की जाँच करने के लिए नीचे bogged। मैं इसे ठीक कर दूंगा। धन्यवाद।
ए.जे.


1

प्रोग्रामिंग के सभी स्तरों की समझ प्राप्त करने का प्रयास करें। निम्नतम स्तर (असेंबली) से उच्चतम स्तर तक।

उदाहरण के लिए पुनरावृत्ति लें जो एक आसान विशेषता है :) विधानसभा सीखने की कोशिश करें और एक कार्यक्रम बनाएं जो विधानसभा में पुनरावृत्ति का उपयोग करेगा।


1

एल्गोरिदम।

एक वंशज तरीके से प्रोग्रामिंग भाषा का उपयोग करना सीखना कुछ ऐसा है जिसे आप सीख सकते हैं जैसे कि आप जाते हैं, लेकिन अपने द्वारा सभी व्यापक रूप से उपयोग किए जाने वाले एल्गोरिदम का आविष्कार करना लगभग असंभव है .. एक व्यक्ति को कम से कम इस बारे में पता होना चाहिए कि क्या किया जा सकता है और क्या नहीं किया जा सकता है। कुछ समस्याओं के साथ।

उदाहरण के लिए, कोई बस बबल-सॉर्ट के साथ कुछ प्रोग्राम नहीं लिख सकता है और यह अपेक्षा करता है कि इसे अच्छा माना जाए, चाहे कोड कितना भी अच्छा हो।

इसे सम्‍मिलित करने के लिए - इंट्रोडक्शन टू अल्‍गोरिदम

इसे मास्टर करने की आवश्यकता नहीं है, बस पता है कि क्या चल रहा है ...


1

एक कंप्यूटर विज्ञान की डिग्री से हाल ही में स्नातक के रूप में मैं निम्नलिखित की सिफारिश करेंगे:

  • जैसा कि विभिन्न पदों बिग ओ अंकन में उल्लेख किया गया है

    ऊ डिजाइन

    डेटा संरचनाएँ और एल्गोरिथम (मेरे द्वारा उपयोग की गई पुस्तक के सटीक शीर्षक को याद नहीं रख सकते हैं, अगर मुझे याद है तो अपडेट करेंगे)

    ऑपरेटिंग सिस्टम http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580

    एनपी समस्याएं


1

यह स्पष्ट रूप से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, एसओआईडी सिद्धांत जैसे अच्छे मार्गदर्शक सिद्धांत और स्थापित पैटर्न और प्रथाओं का पालन करने की एक अच्छी समझ है ।

यदि आप SOA, या DDD को देखते हैं, तो वे सभी अंततः OOP अवधारणाओं के किसी न किसी रूप में वापस आ जाते हैं।

मैं आपको कुछ अच्छी ओओपी पुस्तकें प्राप्त करने और अल-शुरू करने के लिए सी # या जावा जैसी समृद्ध भाषा चुनने की सलाह दूंगा

ग्रैडी बूच द्वारा ओओपी

(PHP, माणिक लोग कृपया मुझे मत छोड़ें, मैं उसके साथ शुरुआत करने के लिए कुछ उदाहरण दे रहा हूं, आप अपने जवाब और सुझाव यहां दे सकते हैं)


1

कंप्यूटर प्रोग्राम की संरचना और व्याख्या । यदि आप इस पुस्तक को समझते हैं, तो बाकी सब कुछ उस नींव पर आसानी से बनाया जा सकता है। यदि आपको पुस्तक में अवधारणाओं से परेशानी है, तो आप एक सॉफ्टवेयर डेवलपर हो सकते हैं, लेकिन कंप्यूटर वैज्ञानिक नहीं।


1

मैं आपको अध्ययन करने के लिए कोई विशिष्ट अवधारणा नहीं बताने जा रहा हूं, बल्कि यह सलाह दूंगा कि आप विषयों की एक विस्तृत श्रृंखला के बारे में बहुत कुछ पढ़ सकते हैं। इस विषय पर आपके द्वारा पढ़े जाने वाले प्रत्येक विषय के बारे में गहराई से समझने की चिंता न करें - यह अधिक महत्वपूर्ण है कि आप पहचान सकें कि आप किस प्रकार की समस्या को देख रहे हैं, ताकि आप कुछ कर सकें- जब आप वास्तव में इसके साथ सामना कर रहे हों तो इन-टाइम अध्ययन। दूसरे शब्दों में, यह ठीक है यदि आप नहीं जानते कि कैसे एक कॉम्बिनेटरिक्स समस्या को हल किया जाए, जब तक आप "कॉम्बिनेटरिक्स" को देखने के लिए पर्याप्त जानते हैं, जब आपको यह देखने की आवश्यकता होती है कि आप कितने तरीकों से वस्तुओं के एक सेट की व्यवस्था कर सकते हैं या एक सबसेट चुन सकते हैं। ।

विकिपीडिया इस तरह के विस्तृत ब्राउज़िंग के लिए एक बहुत अच्छा संसाधन है, खासकर यदि आप अभी शुरुआत करने के लिए तैयार हैं। एक और भी बेहतर, खासकर यदि आप विकिपीडिया को बहुत अधिक अकादमिक या दुर्गम पाते हैं, तो सी 2 विकी है । (यह, काफी दिलचस्प है, मूल विकी वार्ड कनिंघम ने किया था)।


0

मुझे लगता है कि मल्टी-थ्रेडिंग के पीछे मूल सिद्धांत को समझना आवश्यक है, इसके बिना यह देखना भी मुश्किल हो सकता है कि कोई समस्या हो सकती है, जब तक कि आप एक लाइव सर्वर पर रविवार सुबह 4 बजे डिबगिंग नहीं करते।

सेमाफोर, महत्वपूर्ण खंड और घटनाएँ।


0

नहीं, बबल सॉर्ट नहीं, क्विकसॉर्ट। यह बिग-ओ चीज है- बबल सॉर्ट एवरेज ओ (एन ^ 2), क्विकॉर्ट ओ (एन * लॉग (एन)) है।


0

मैं कहूंगा कि सबसे महत्वपूर्ण सामान नीचे हैं

  • ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग
  • ऑपरेटिंग सिस्टम अवधारणाएँ
    • प्रक्रिया और धागा
    • शेड्यूलिंग एल्गोरिदम
  • डेटा संरचना
    • डेटा संग्रहण और संग्रह का प्रकार, प्रकार (लिंक्डलिस्ट, हैश, सरणी आदि)
    • एल्गोरिदम को छांटना
    • एल्गोरिदम की जटिलता

फिर विशिष्ट भाषा से संबंधित सामान पर जाएं। मुझे आशा है कि यह मददगार है!!


0

मैं बोली से शुरू करूँगा:

"यदि आपके पास एकमात्र उपकरण एक हथौड़ा है, तो आप एक नाखून की तरह सब कुछ मानते हैं"। (अब्राहम मेस्लो)

सबसे महत्वपूर्ण सिद्धांत, आईएमओ, कई अलग-अलग प्रोग्रामिंग प्रतिमानों, भाषाओं को जानना है और अपने निपटान के साधनों के बारे में खुद को अच्छी तरह से सूचित करना है। किसी भी समस्या को आपके द्वारा चुनी गई लगभग किसी भी भाषा में हल किया जा सकता है, इसकी विशाल डिफ़ॉल्ट लाइब्रेरी या ऑटोहॉटके जैसी छोटी विशेष भाषा के साथ पूर्ण विकसित मुख्यधारा की भाषा हो। प्रोग्रामर का पहला काम यह निर्धारित करना है कि समस्या के विनिर्देश के अनुसार क्या उपयोग किया जाए। कुछ अवधारणाएं विषय के लिए बेहतर दृष्टिकोण प्रदान करती हैं, जो भी आपका मुख्य लक्ष्य हो सकता है - परिष्कार, आपत्ति, प्रदर्शन, पोर्टेबिलिटी, मुख्यता, छोटे कोड आकार ...

अन्यथा आप कुछ प्रोग्रामर की तरह समाप्त हो जाएंगे जो विशेष रूप से एक 1 भाषा में कुछ करने की कोशिश करते हैं, जबकि समस्या अलग प्रोग्रामिंग संदर्भ में हल करने के लिए तुच्छ हो सकती है।

यह सलाह बहु-भाषा परियोजनाओं के लिए आज की प्रवृत्ति के साथ चलती है (उदाहरण के लिए वेब एप्लिकेशन लें, जिसमें एकल अनुप्रयोग में कई भाषाएं शामिल हो सकती हैं, जैसे C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... और यहां तक ​​कि विभिन्न प्रोग्रामिंग प्रतिमान (उदाहरण के लिए, C # ने हाल ही में कार्यात्मक प्रोग्रामिंग प्रतिमान, लैम्ब्डा से कुछ अवधारणाएं पेश की)।

तो, मूल बात निरंतर सीखने की है, हमेशा के लिए :)


0

मुझे लगता है कि 3 डी-ग्राफिक्स कुछ ऐसा है जिसे हर किसी को सीखना चाहिए। या कम से कम कैसे ठीक से सजातीय वैक्टर और मैट्रिक्स-ट्रांसफॉर्म का उपयोग करें।

यह न केवल 3 डी-एप्लिकेशन बनाने के लिए बल्कि रोबोट पर उलटा किनेमैटिक्स जैसे मैकेनिक क्षेत्रों में भी मदद करता है, क्षणों की गणना करता है और बहुत सारे अन्य सामान।

मैं पूरी तरह से रैखिक बीजगणित को नहीं समझ पाया, जब तक कि मैंने 3 डी-ग्राफिक्स नहीं पढ़ा था, तब तक के सबसे अच्छे पाठ्यक्रमों में से एक, जो मैंने कभी भी लिया है, भले ही हमारे शिक्षक खराब थे।


0

चूंकि कई कोर (सीपीयू और जीपीयू दोनों) वाली मशीनें मानक बन रही हैं, इसलिए मैं डिस्ट्रीब्यूटेड अल्गोरिदम (कई थ्रेड्स से कई मशीनों तक) को शामिल करना चाहूंगा । मल्टी-थ्रेडिंग और वितरित प्रसंस्करण को समझना महत्वपूर्ण है। क्षमा करें कि लिंक वास्तव में बहुत सहायता प्रदान नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.