Permalink
Switch branches/tags
Nothing to show
Find file
c0892a5 Oct 12, 2017
@shlomif @hari-sikchi @Ajeet-Yadav
459 lines (306 sloc) 40 KB

Freenode programming channel FAQ

This page is intended to be global for the whole ##programming channel. So feel free to clone and reuse.

The Questions

How do I talk on the channel?

In order to talk on ##programming, connect your IRC client to the irc.freenode.net server, type «/join ##programming» (without the angle brackets) and press enter. It is a good idea to register your nickname with the Freenode network (see /msg NickServ HELP). This URL may work for you: irc://irc.freenode.net/##programming .

Freenode also provides a web interface here: http://webchat.freenode.net/ . For more information about viable IRC clients see:

What is considered on-topic on ##programming? What is considered off-topic?

Refer to the channel rules for more information.

I tried joining a different channel for help, but I could not - why?

Some channels people try to join to seek help with their technology (notably ##java) require registration at the Freenode services. See Freenode’s knowledge base for more information about user/nickname registration.

Note that you are still welcome to ask questions related to specific technologies on ##programming, but otherwise you'll probably get more help on the topic-specific channels.

Why do ##programming and other channels have two "#" whereas other channels have only one?

To quote from this post about Freenode: «The name of a “Primary Channel” starts with a single hash (“#”) and is discussion forum for a specific project or community (like Alfresco, or your local LUG). “About channels” start with a double hash and host conversations about a topic or subject (for example: ##security). »

Why do some users on the channel have +v (voice, a + sign, a blue circle, etc.)?

These users are voiced so in case the channel is under attack, and it will become restricted, then they and only they will be able to talk here. Normally, it should not matter, as when there is no major abuse, everyone can talk whether +v'ed or not.

How should I ask a question on the channel? Can I?

The first guideline is that you should not “ask to ask” by saying “May I ask a question?” or asking if anyone worked with that certain technology. Just ask for help directly.

The second guideline is that you should probably read or skim the guide “How To Ask Questions The Smart Way” and try to follow its wisdom, which involves doing some prior due diligence.

Otherwise, also see the next question for how to share the offending code with the channel.

I have a problem with my code, how should I share it for people to review?

First of all, your code should exhibit the problem you are having and should be a ''self-contained'', and ''reproducing'' example (see “The Short, Self Contained, Correct, Example” page). If the code is too large, please consider reducing it to a more minimal example that still exhibits the problem (see the bisection method ).

Please don't share non-runnable pieces and fragments of your code, see “Show Us The Whole Code” .

Once you have that, you have several options to share it. If you are coding a web page, you can try sharing your code using jsfiddle . Otherwise, if your code is self-contained in one file, you can use a paste site such as ideone or paste.debian.net. Please don't floodpaste the code to the channel because this is slower and more annoying than using a paste site and may get you kicked or devoiced out of the channel.

If you have more than one file in the project, then you should put it in a self-contained version control repository on a code sharing site such as GitHub , Bitbucket , or GitLab , so we can easily clone or checkout it.

Which Integrated Development Environment (IDE) or Text Editor Would You Recommend?

We get asked this question a lot. The answer is a bit long. First of all, it is likely that the following editing mechanisms will not be adequate for editing code:

  • Rich-text editors including, but not limited to, Microsoft Windows WordPad (formerly known as Windows Write, we were informed that it has a text editing mode, but see below), word processors such as Microsoft Word, OpenOffice.org/LibreOffice Writer, WordPerfect, AbiWord, etc. and WYSIWYG (= "What you see is what you get") HTML editors. These are not suitable for editing code.
  • Limited text editors such as Microsoft Windows Notepad (see http://www.notepad.org/ for a very fun link about it ), or Pico which are aimed for casual editing of text documents. More capable text editors such as Notepad++, Notepad2 and GNU Nano, should be OK.

These editors may still be useful if that's all you can use, but if you can afford to install and/or use a more capable text editor, it is, by all means, a good idea.

Otherwise, asking the channel about the most recommend text editor will end up in people giving you their own preferences (which may have involved many years of trying different solutions, and dedicating some time to studying their existing preference and getting accustomed to it). Some links to get you started:

Note that many decent text editors and IDEs are open-source, free-of-charge, and cross-platform (Windows, Mac OS X and Linux/UNIX). As a result, there is no good excuse not to download one, install it, and use it.

I want to learn programming? Which language should I start with?

Different people will give different answers when asked that. Most people on ##programming believe that something like the Python programming language would be a good start. Python is a popular, useful, open source, and cross-platform (runs fine on Windows, Linux and Mac OS X and on many other less common platforms), that is not too hard to learn and get your feet wet with. Some resources to learn Python are:

Here are some resources for learning other programming languages, whether as a first language or after knowing some other languages:

How should I do binary Input/Output properly?

Some people would naïvely assume that writing a C struct directly to a file would be a good solution for outputting it to disk. That is far from the case, however. The representation of a struct in memory is subject to many system-dependent factors, such as:

  • Endianness - also referred to as byte sex, this determines whether bytes are stored in memory with the lowest byte first or the highest one.
  • Padding - for efficiency reasons, compilers tend to place empty spaces between the fields of structs. The amount of such space is not standardised and varies between systems, compilers (and even compilation options can affect it).
  • Integral data types and pointers can vary in their nominal size. I.e: an "int" can be 16-bit, 32-bit, or 64-bit, a "long" can be 32-bit or 64-bit, etc., which is system-dependent.

The O’Reilly book Porting UNIX Software (available for purchase or download under a Creative Commons licence on the link), goes into further depth about these and many other UNIX portability issues.

In any case, the best way to mitigate this problem portably and safely, is to write (and later read) every field (and sometimes every byte within) to the disk or network. You should be able to find some mechanisms inside portable libraries to do that.

What are some best practices in programming that I should adopt?

First of all, we should note that many best practices may still be controversial to a small or large extent, despite being very common in the industry. We also don't expect a beginning programmer who writes some simple programs to immediately employ all the best practices that go into developing mission-critical software on which lives are dependent.

But here goes with a grain of salt:

  1. Use a good version control system. For more about version control systems and the motivation behind them see the “Better SCM” Site and a related section from “Perl for Perl Newbies” (which is not exclusively limited to Perl) and Sawyer X’s talk about source code management systems.
  • Please don't give the usual cliches that you don't need a version control system if you’re only one person or that the project is not large enough to warrant it. You probably do.
  1. Write Automated Tests. See Test-driven development and other resources.
  2. Use a standard build/configuration system for the language you use. Simple makefiles may be adequate for small projects, especially those written in C or C++. If you need to handle dependencies, build-time configuration variables and other complications, you should look at alternatives for C or the community-based alternatives for your programming language of choice (e.g: setuptools for Python; Dist::Zilla for Perl; RubyGems for Ruby).
  3. Deploy a local or hosted Continuous Integration service and make sure that failing builds or tests are remedied.
  4. Set up a bug tracker and use it to manage the issues and tasks' list. Some code-sharing sites provide hosted web-based issue trackers free-of-charge.

For more information consult these links:

  1. The essay “What Makes Software High Quality?”
  2. “Awesome Guidelines” - a curated list of high quality coding style conventions and standards.
  3. The Perl Beginners’s Site “Perl Elements to avoid” and its spin-off “C and C++ Elements to Avoid” (both of which have a lot of good advice related to other programming languages).
  4. The essay “Clean Code JavaScript” on GitHub.
  5. The tongue-in-cheek essay “How To Write Unmaintable Code” .
  6. A discussion on Dave Cross’ Perl Hacks blog titled “You Must Hate Version Control Systems”.
  7. The Daily WTF is a web site dedicated to posts about awful, but funny, programming practices.
  8. The Joel Test and similar resources on the Joel on Software site.

What is the best programming language?

We sometimes get asked this question, and the answer is simple: there is none. Different languages have different strengths, weaknesses and often trade offs. You may wish to read the blog post “(Why) Your Programming Language Must Suck” for a short coverage of some of the important trade-offs a language design will have, and why no one will be happy with it all the time.

Even if we settle on a certain amount of preferences, then you may run into other factors that influence which language you may prefer:

  1. Should the program run as quickly as possible? Or do you want to optimise for the developers’ time?
  2. Is low memory consumption critical?
  3. Should the language be portable to various operating systems and/or CPUs? Or is it OK if it only runs somewhere specific?
  4. Should the language have an open-source implementation?
  5. Should the language have a large user base, and provide quick and useful support?
  6. Should bugs be addressed and fixed quickly in the implementations?
  7. Should the language have any particular built-in features that you desire?
  8. Should the language have an extensive library of extensions and APIs that can be reused?

Etc. If you tell us what your needs are, we can help you with a recommendation.

Note that some of the channel members happen to like a certain programming language in particular and tend to constantly recommend it to other people. Furthermore, you may run into language wars where one or more languages are bashed as awful languages by participants in the channel. That does not mean these languages are necessarily good or bad or suitable for what you wish to do.

What is the best [insert type of product with some alternatives]? What is the best and [insert adjective here]?

We also get asked this a lot and the answer is similar to the previous question: best in which respect? The various alternatives may have functionality trade-offs, and even if the factors are not at odds with one another, there can be remaining issues due to lack of developer time, policy, or design. Please tell us what exactly is the most important to you.

Note that "best and [insert adjective here]" is equally puzzling. Do you want the product with this property or do you also seek some other qualities?

What are good resources (including books) to learn about algorithms?

Here are some resources for learning about algorithms:

There's also a channel called "#algorithms" on Freenode and, naturally, you can discuss algorithms on ##programming, as long as you perform due diligence.

I have an awesome idea for a great project (probably a game) and I want people to help me…

First of all, we appreciate your enthusiasm, but you should realise that most of us have better things to do than help you (even if they are unemployed), and so you should offer money (and we don't mean a share of the profits.). If not, you are quite unlikely to recruit anyone.

If you cannot offer money, please consider learning the necessary skills yourself (see the above questions) and starting work on your own. If you make your project open-source and publicise it, then other people may eventually join you, and help you if they find it interesting.

What is the difference between “scripting” languages such as Perl, PHP, Python or Ruby and “Industrial-strength” Languages such as C, C++, Java and C#?

Many people have issues with calling dynamic languages, with dynamic typing and those that are of somewhat more open-source nature such as Perl, PHP, Python and Ruby as “scripting” languages. See:

The problem with calling them that is that it is that while they allow for getting small and simple things done quickly and easily, large scale projects (100,000s to millions of lines of code) have been written in them and are still maintained without any show-stopping difficulties. That is not to say that these languages do not have their downsides, but they still do not preclude general-purpose, and/or large-scale programming.

Furthermore, if we consider Perl/PHP/Python/Ruby/Tcl/Lua/etc. as “scripting languages” and C, C++, Java and C# as “industrial strength” where does Common Lisp fit in? Where does Scheme? Where do Haskell and OCaml? What about the various dialects of Basic? Fortran? COBOL? It seems that the classification of languages as “scripting” vs “industrial strength” is more of that of public perception and marketing as opposed to their actual qualities.

On the other hand, we do not wish to claim here that C, C++, Java and/or C# are necessarily bad languages, or that you should not study them or refuse job offers that involve writing code using them.

I need to learn about various base systems, like hexadecimal (base-16), binary (base-2). Where can I find information about them?

See:

I want to buy some interesting books to read. Can you recommend me some?

Here are some lists of recommended books by some of our regulars:

In addition, here are some recommended lists of books by some notable software engineers and writers:

How do I learn how to use GDB (= the GNU debugger)?

We are often approached by people who tell us their C or C++ (or whatever) program crashes or otherwise misbehaves and then ask us why. If that's the case for you, you should realise that you should learn how to use an interactive debugger in order to debug your program, and you should learn how to do so as soon as possible.

One such debugger is the open source command-line debugger, "gdb", which can be used to debug programs in C, C++ and some other languages. Here is some information on learning to use it:

Also note that gdb has some GUI frontends that may make it easier or more convenient to use.

I feel like programming something, but I don't know what. Can you suggest some good ideas for programs?

For some lists of ideas for what to program see:

In addition, note that you may wish to consider contributing to open source projects that you find useful or interesting. For more information about that see:

I want to contribute to an open source project, but how? Which one can I contribute to?

First of all, it is good that you wish to contribute and good luck. Here are some resources to get you started:

If you still need ideas for which open source projects to contribute to then ask yourself - which open source projects are you using? (Either directly or indirectly.) Which ones are you interested in? If that fails perhaps try using GitHub search, DuckDuckGo, Google, the English Wikipedia search or other search resources.

What is FizzBuzz?

In short, FizzBuzz is a simple programming task, which most decent programmers are expected to be able to easily write, but, reportedly, most interviewed software development candidates cannot write it. It's a kind of litmus test for programmers.

For more information, see:

How are C, C++, and C# (C-sharp) related? How are they different?

  • The C Programming Language was created by Dennis Ritchie and other workers, and was used to write most of UNIX. It is a kind of "mid-level" language because while it is above assembly, it is still lower-level than most other high-level languages.
  • C++ originated as some extensions to C to facilitate object-oriented programming (OOP) there, and has since developed many more extensions. C code can usually be compiled using a C++ compiler as is, but such code is no longer considered idiomatic C++. C and C++ can also call each other's routines, with relative ease.
  • Java is a programming language whose syntax is superficially reminiscent of C, but which has otherwise different syntax, semantics (including garbage collection) and a completely different standard library.
  • C# was inspired a lot by Java, and is very similar (but not compatible), and is not compatible with either C or C++. It is just sharing a name containing "C" for presumably marketing and branding purposes.
  • Managed C++ is a C++-like language for the .NET framework (which is also used to host C#), which isn't entirely compatible with C++.

As a result, the term “the C family of languages” is confusing and should be avoided, in part because other languages not mentioned above may share similar syntax to C.

I am facing a number of problems while using floating-point data types (e.g: "float" or "double"). Is there a explanation for this?

Computers use binary numbers because they’re faster at dealing with them, and because for most calculations, a tiny error in the 17th decimal place doesn’t matter at all since the numbers you work with aren’t round (or that precise) anyway. Moreover, because they use a binary floating point,they cannot represent a number like 0.1, 0.3, etc. accurately at all.

When the code is compiled, the floating point number is rounded to nearest number in the format, which results in rounding error even before the calculations. Furthermore, associativity in addition may result in different results: a + (b + c) != (a + b) + c and it is possible to get weird results like a + b == a if a’s exponent is much larger than b’s.

For more information, refer to these resources:

How do I hide/obscure/“encrypt” my source code to prevent end-users from learning how it works?

If you want to distribute some code you wrote and prevent end-users from learning its inner working, there are a few things you need to be aware of.

The first is that there are decompilers and that it is often possible for humans to do reverse engineering in order to determine the inner workings of a program to duplicate them. We were told that there's a code-obfuscation technique that can usually prevent that, but its downside is that the resultant code is much larger and much slower (by a factor of about 100,000), so it'll likely be unacceptable to you.

The second is that some popular approaches for "hiding" the source code are known to be ineffective - see this post about distributing CPython's .pyc files for an example.

The third is that a mostly failproof way to avoid revealing your code is to set up a world-wide-web service (or a different Networked service) for it and have the local end-user code query it using the network stack.

Another point is that you should consider trusting your users instead. Shlomi Fish (“rindolf”) has a written a cautionary tale about the fact that BitKeeper’s parent company, BitMover, has done a series of licence changes to BitKeeper over the years to prevent abuses from users who were unlikely to become paid customers out of sheer paranoia in “What BitMover Got Wrong?”, and you should better avoid it. Freenode is dedicated to discussing collaborative and free/open projects and you are likely to receive a lot of heat for not trusting your end users.

Finally, note that Copyrights or software patents may provide adequate protection into people misappropriating the working of your code, although they may be controversial (especially software patents). For more information, see Eric Sink’s essay “Five Things Every Micro-ISV Should Know About Intellectual Property” .

Who is the world’s best programmer?

We got asked several times who is world’s best programmer, so let’s try to answer it once and for all. The first question we need to ask you is: “Why does it matter?” If you knew who the best programmer in the world is, do you think you can afford to hire him? Moreover, as a post by Ovid notes, studies found that the best programmers are only 5 times more productive than the worst, which is consistent with productivity variation in other fields. Furthermore, a contractor who did both web development and Linux kernel development noted that despite common belief, “web development is harder than Linux kernel development”.

Finally note that some software developers were able to contribute a lot to the world of computing while writing only sub-optimal code. See the post “Why some Great Hackers Write Inelegant Code”.

The most important thing you can do is constantly try to improve your programming skills, and learn from your fellow programmers, and from good and bad code people wrote out there. One way to achieve that is to be present on software development's forums, including ##programming .

I printed something but don't see it on the console yet! My output is out-of-order? Help!

You may be suffering from buffering. First of all, go over Mark Jason Dominus’ “Suffering from Buffering?” page which is somewhat focused on these issues for Perl 5. Then you may wish to:

  1. In C, make a judicious use of fflush(), or use locks for synchronisation.
  2. In C++, use std::flush.
  3. Use similar routines for your programming language of choice.

What do “NP-Complete”, “NP-hard”, etc. mean?

Try referring to these links:

In addition the English wikipedia has a list of problems that were shown to be NP-complete.

What do you think about interpreted vs. compiled languages?

First of all note that “interpreted” vs. “compiled” is an implementation detail, and a programming language may have more than one implementation.

Morever, it is not always that straightforward - there are also languages that compile the raw text source code into p-code or bytecode and then interpret that, there is just-in-time compilation (JIT) and there may be some other approaches.

Note that one should not use the fact that an implementation is interpreted against it, because it may not be slower than compiled code all the time, and because it may still be fast enough for many uses given today’s processors.

Despite some common belief, C has some interpreters as mentioned on stackoverflow while some dynamically typed languages such as Common Lisp, Scheme, or Python have compilers.

How is JavaScript related to Java? What is the difference between them?

JavaScript (also see its Wikipedia entry) is a programming language first introduced in version 2.0 of the browser Netscape Navigator which also introduced support for browser-hosted Java applets written in the Java programming language.

According to this blog post titled “Popularity” it was designed so its syntax will resemble Java (which ruled out the use of other popular open source languages at the time) and was named “JavaScript” for marketing reasons. Despite that, Java and JavaScript codes are not compatible with one another.

For more information, see:

How can I learn Web Development? (HTML/etc.)?

First of all, you may wish to go over “The Unix and Internet Fundamentals HOWTO” to gain some basic understanding of how the Web works over the Internet.

After that, read HTML Dog which hosts some quality tutorials about HTML, CSS, and JavaScript.

After that, perhaps using a static site generator will be good enough for you, and static sites are more secure and require less maintenance than sites with server-side scripting. If you need something to run on the server, then you have a lot of choice for server-side technologies and often web frameworks and APIs for them.

Where can I get help with writing my own operating system or kernel?

First of all, Freenode has a channel called #osdev and it is possible that you may get better help there.

Otherwise, we should distinguish between two different cases. The first is that you're just writing the kernel as a learning exercise and do not intend it to be production-ready. In that case, you may go forward with whatever design you have in mind.

The other case is that you want your operating system to be popular. In that case, you should probably make it POSIX-compatible in order to avoid what Joel on Software calls “Chicken and Egg Problems”. You should also consider contributing to one or more of the existing open source operating systems out there, because that way your efforts will be much more likely to amount to something.

Is {software dev paradigm, e.g: Object-Oriented Programming, Functional Programming, Structured Programming} bad/good/better/worse?

We had several people join to try to provke a discussion about whether Object-Oriented Programming or a different software paradigm was bad or had alternatives. These discussions were rarely constructive and usually were pointless, so you should avoid sparking them.

If you are working on a project that is under your control, you can try to use programming languages which avoid this particular paradigm. If you need to use it for your day job, you can either look for a different job and/or realise that “Reality to be conquered must be obeyed.” and all that jazz, and try to cope with what you have.

Otherwise, it is unlikely that adopting a certain programming paradigm, or alternatively ditching one completely, will magically solve all the world's software development problems, and provoking heated debates about it on ##programming is even less likely to make that happen.

Why are people still using C when there are languages like Rust or Pony?

First of all note that we do not mean to imply that languages like Rust or Pony are not without their merit, or do not provide any significant advantages in comparison to C or C++.

That put aside, there are some reasons why C may still be popular:

  1. Due to legacy and inertia and the fact C has been around for many years before Rust was introduced, there is a lot of C code out there, and it still needs to be maintained.
  2. Rust reportedly compiles extremely slowly, which may be prohibitive especially for large projects, and similar complaints were voiced against C++’s compilation speeds.
  3. Rust and Pony may be quite more complex than C.
  4. Some people may still like C, and they are still allowed to use it.
  5. Rust appears to have become a religion-of-sorts, which deters some people from using it.

If you like Rust or Pony or whatever, and wish to promote them, then it would be a better idea to actively contribute to and improve their core or ecosystem, rather than ranting about how much their older alternatives suck on online forums. Like a wise man once said: “After all is said and done, a hell of a lot more is said than done.”, and you should try to keep the ratio smaller.

Is it true that ##programming is more about Anime than programming? (Just like #anime is more about programming than Anime)

That's not really true. While we sometimes discuss popular culture and entertainment (including but not limited to Anime) most of our conversations are about programming, or related computer help. It's not our fault that your favourite Anime-themed channel discusses programming a lot, and that may be caused by the fact that the IRC medium and Freenode in particular are somewhat more "techie"-oriented. So don't expect to join ##programming and hear many quality discussions about Anime.

Licence/License

The textual content of this document is made available under the Creative Commons Attribution 4.0 International licence (or at your option - any later version). Whatever code is given here is made available under the MIT/Expat License. Share and enjoy!