When It Starts to Click
Thursday, 1. November 2007, 23:20:44
The way I view programming is different than it was a week ago due to various factors.
Statements like these make my day.
It is all coming together for me now, the conscious understanding of what I really dislike about programming.
The realisation of what is wrong is easy. The understanding of why it's wrong is true genius.
Everything we slap on top of the development process is more garbage on top of a rotting foundation.
Every reaction to the truth behind the way we do computing today seems to go this way. Disgust.
Then (i.e., 10 -20 years ago)
A programmer sits down and analyzes the process of the work.
...
This continues until the program is considered complete.
Now
A programmer sits down and analyzes the process of the work.
...
This continues until the program is considered complete.
Boldness not mine in this case.
The ... are just variations on the same theme. Ultimately, we remain stuck in the dark ages of computing.
We are stuck, and we are stuck badly.
My words exactly. I wrote them before I saw this quote.
I assert that we need to go far beyond something like Lisp at this point; we need to get into an entirely new type of language.
The want to move forward is the key to progress.
If you’ve spent a fair amount of time with multithreading, you know that it will never become a commonplace technique until the compiler can handle most of it automatically.
Automatic multithreading. Now that's a goal.
Smarter compilers are the answer, but there is a truth amongst the compiler folks that compilers will never get that smart. Why? Because properly translating a serial operation into a parallel one requires understanding the code’s intentions and not just the step-by-step how to guide that the source code models.
Now into the fire. Where is the solution? Translations of step-by-step instructions are the wrong question/problem to solve. This is where most people go. And where most people get stuck. The sense of discovery is the only thing that can carry one over that boundary.
In order for the compiler be able to understand those design specifications, it would require an entirely different type of language and compiler.
Standing on top of the mountain now. What direction will he look? What does he see?
Assertations and other “design by contract” items are not even the tip of the iceberg
Nope. Not that way.
SQL is a great example. You tell it what you want not how to get what you want. The details of the “how” are up to the database engine.
Eureka! But examples are one thing. Can he climb back down the mountain with the tablets?
The problem you are most likely trying to address has absolutely nothing to do with the language you are using and everything to do with a specific, nonprogramming problem.
Trying to put it all down into something concrete.
I want to see programmers headed towards intentional languages. I have no idea what they would look like, but the source code would have to be a lot more than the usual text file and would need to be able to express relationships within the data format, like XML or a database do.
Like so many before him, he comes back down from the summit with nothing more than crumbs. He instinctively knows the answer though. He knows where he should be looking. But he cannot bring himself to it. Something stops him.
I wanted to quote this article because it so closely matches the road I took. I too came back down empty handed many times over. Once, I actually came back with a version of functional programming all proud of my discovery. Then I realised it did not work. That's actually when I realised it was FP. I saw more hidden truths about FP and why it failed. Why it must fail.
It's unfortunate that the article didn't go on further. I would have liked to have seen where he would go with it. For me, the journey was to go back up the mountain and stop looking around for things that already existed. Being atop the mountain now served a different purpose. To see why things did not work. Whenever my creations failed, I could look around and see what it most resembled. Then I could gather more information about that way of doing things and see exactly why it failed.
One day, I realised I was modelling for only one specific kind of machine even if all the hardware changed. I rephrased the question. Originally, I wanted something that would enable me to use the best features of whatever machine my software would run on. This is why I'm actually surprised that the author of the linked article knew the correct question. The "how" is up to the machine. The "what" is up to the developer. This time though, I decided that the Internet itself was the machine I was going to develop for (or at least be one of them). If my software was going to be portable and use the best features of that machine, one such machine is the Internet as a whole.
Once I made that critical realisation that the Internet is itself a machine, then all the pieces started to fall into place. Communication between nodes had to be done via data only. I told myself there HAD to be a way to create software that used all these nodes. There just had to be a way to represent what I wanted to do and have it work on such a model. My mind was reluctant to accept the answer. I actually refused it many times. I woke up with the answer. It was the only way to obtain it for me. My subconscious came through.
Thinking about a problem is one thing. Actually sitting down and trying to come up with a real workable solution is another. I can't stress enough how important asking the right question is. The wrong question will never yield the correct answer no matter how hard you try. I can't count the number of times I've read accounts like the one in the linked article. I've mentioned a few over the lifetime of this blog. My personal account has also been travelled before by others. Perhaps not to the detail I'm going into with Project V, but at least with data flow. I want to keep going. To find out how to create organic software that can adapt and grow by itself.
Our road is not one of discovery, but of rediscovery. Even if we do achieve true neural networks that work as good as our brains or build organic systems that can repair itself or grow new parts, we're still only recreating something that is all around us every day. As the old adage goes, it's not the source or destination that counts, but the steps in between. My consolation is that I am not alone. There may be very few people around who walk the same path, but those that have stopped for directions are not far behind.
You've made it sound (to me at least) like Project V is about being able to easily send messages to and start processes on other compute nodes. How do your ideas differ from the concepts of open, distributed computing, implemented in languages like Alice ML?
By anonymous user, # 2. November 2007, 23:16:18
By Vorlath, # 3. November 2007, 05:18:53
It is nice to know that I am not the only one out there who has been through this.
I am generally more and more of the opinion that the problem is rooted at the OS level for sure, and quite possibly at the hardware level. For example, I find it utter madness that it is still up to the OS to handle swap files. That could be and should be a simple hardware function.
It is sad that this is near heresy to most folks out there. One of the questions I use to seperate "senior" developers from "intermediate" is, "have you ever worked with a functional programming language?" If they respond with, "I may have, what are some languages like that an I will tell you if I have used them?" then I know that they are not senior. Not that actually having worked with them is needed to make someone senior, they just need to have enough experience in the world to have heard of them.
In other words, I may have come down from the mountain empty handed... but there are far too many "programmers" out there who do not even see it. Let's keep fighting the good fight and expand their ranks.
Thanks for the thought proviking response to my post!
J.Ja
By anonymous user, # 4. November 2007, 03:48:11
I'm sure you've already answered this, but please oblige my obvious question. Isn't Erlang a language that "deals with concurrency"? Is it not a functional language? Why will I never get anywhere with functional programming? I think I already have, and had fun doing so.
I understand that concurrent message passing is not "functional", and in fact, it is not possible to implement it in Lambda calculus. However, all functional languages that I know of: ML, Scheme, Erlang, Haskell, etc. either have libraries available or come with such constructs. This is because all these languages aren't implemented in the Lambda Calculus (that would be absurd).
By anonymous user, # 6. November 2007, 13:17:45
Just so you can attach an identity to these silly questions, I'll mention I posted the first anonymous post, and the one above. Also, why does the security code always fail on my first attempt to post, but works after refreshing this page?
By anonymous user, # 6. November 2007, 13:32:59
NM, it worked the first time previously. Maybe I always type it incorrectly the first time.
By anonymous user, # 6. November 2007, 13:33:54
I'm getting better at this!
By anonymous user, # 6. November 2007, 13:34:20
BTW, I'd like to mention that I appreciate and am impressed by what you're working on (I've been keeping an eye on this blog for a while (I'm a regular lurker I suppose)), but I'm not always impressed with your arguments. Perhaps you could learn a little from the kind of arguments a lawyer makes
By anonymous user, # 6. November 2007, 13:41:10
You answered your own question. You didn't get anywhere with functional. You did with data flow. In fact, monads, lazy evaluation, map/reduce, arrows and all that stuff is data flow (I like picking on Haskell). If functional was enough, you wouldn't need all this other stuff.
No clue. I've asked the people at Opera to look at it, but they don't seem concerned. I can't reproduce it, but I do know that problem exists. I'm thinking of switching to my own host. I think I'll do that once Project V is in the beta stage.
This article doesn't make any arguments. It just explains my POV at the time. If you want arguments, you have to go to the articles that discuss that particular topic head on. Let me know what you're interested in and I'll point you to it, or I'll discuss it directly with you.
And sorry, but it's impossible to learn anything from lawyers except how to ruin your life and those of everyone around you.
If you disagree with my arguments, please state the errors. I'm always interested in knowing where I made mistakes. But if I'm not holding my breath, it's because it has been my experience that most people have preconceived notions and cannot back them up (and that I keep hearing the same invalid arguments), not that this is the case with you though.
Finally, thank you for your comments about what I'm working on. I hope you remain interested.
By Vorlath, # 6. November 2007, 19:10:47
Quick note, I actually have a real question for you after this comment. Skip this comment if you don't have any free time.
"You answered your own question. You didn't get anywhere with functional. You did with data flow. In fact, monads, lazy evaluation, map/reduce, arrows and all that stuff is data flow (I like picking on Haskell). If functional was enough, you wouldn't need all this other stuff."
Well now this is reduced to a discussion of terminology rather than ideas, but I will continue anyway. I'll continue because I'm confident that my definition of "functional" matches with those in the functional programming community (Scheme and Haskell programmers I've talked to). Your definition of functional has been perplexing me since I started reading your blog.
My definition of "functional" is: dealing with objects that map an argument to a result in a consistent fashion. I'm not going to get too precise, because you know what I'm talking about. "consistent" means same argument gets same result, so no side effects, and "objects that map an argument to a result"... well I hope I don't need to continue. Nobody believes you can do anything sane with pure lambda calculus. That's worse than Brainfuck. You need at least something like Pi calculus plus some reasonable operations, like integer math, at the very least.
You make it sound like Data flow programming is an enemy of functional programming. The way I define "functional programming" they are best friends. In fact, all cases of data flow programming I've run across are implemented in, or as extensions to, existing functional programming languages (need I list the examples?). This is because (I believe) going from "functional" to "data flow" is a natural step, but going from procedural to data flow is less of one, because you first have to essentially think about your procedural language in a functional manner. The natural progression in my mind goes something like "boolean logic implemented on physical devices -> binary computer -> assembly language -> compiled procedural language -> functional language -> data flow language / logic language / etc".
Which brings me back to Haskell. Almost all of the aspects of Haskell I find interesting can be thought of as abstracting out more and more implementation, and making it more like a data flow language. AFAIU, monads can be used to do this in a type safe and intelligent fashion. Consider a classic example where you have a type that holds state, and you have a number of functions of type "MyState -> IO MyState". You can simply chain them together with "func1 mystate >>= func2 >>= func3 >>= func4 ... etc." Hmm, seems a little like data flow, doesn't it? And this is the most basic of basic cases, that even I'm comfortable with. A lot of libraries take it much much farther. In fact, I'm starting to see various monadic operators as textual syntax representing different styles of lines connecting boxes, but I'll elaborate on that another day.
I don't see why or how you could pick on Haskell folks, because none of them are fooled by what they're doing. I would directly quote a Haskeller on this, but I don't feel like scrolling through my irc logs. The quote was basically like "Haskell programming is all about the data". I've spent quite a bit of time talking and listening to experienced Haskell programmers on the #haskell channel, and typically they are very informed, especially about various programming paradigms (far more than I am, and I find I'm far ahead of the average coder). I would bet that a typical Haskeller would say "data flow" if you asked them what their favorite paradigm was. Or maybe they'd say something more specific.
Anyway, enough with terminology and whatnot. I actually have an interesting question. But now that I've rambled so much, I think I'll save it for my next comment
By anonymous user, # 7. November 2007, 00:34:43
So my actual question here is about how you deal with typing and concurrency. Can you add new nodes during runtime, and can you change the types of messages the nodes communicate during runtime?
If you can, how do you deal with the types? Either you must have runtime types, or something interesting.
If not, don't you think this looses a lot of good flexibility?
That's my question essentially. I have a lot more to say about data flow programming and visual languages, but I'll bore you with that later.
BTW, my new theory is that the security code expires after a certain amount of time.
By anonymous user, # 7. November 2007, 00:51:13
"And sorry, but it's impossible to learn anything from lawyers except how to ruin your life and those of everyone around you."
That's not what they teach you in law school, and I've learned other things from lawyers that I know personally. Fortunately I've never had to meet one in court. Anyway, this is exactly the kind of statement I was trying to tell you I'm unimpressed with. It's entirely unsubstantiated.
All professions require a surprising amount of skill in order to not screw up, and no single group of people are worthless or stupid. Including lawyers and functional programmers
By anonymous user, # 7. November 2007, 00:57:02
Your most recent post seems to indicate that you're dealing with runtime types, and also seems to me to imply that you can't actually change the topology of your nodes during runtime. Have I misinterpreted that? I think I could have misread on both accounts.
By anonymous user, # 7. November 2007, 01:53:03
That's too ambiguous. Can you have multiple inputs? (Yes) Can you have multiple outputs? (Doubtful) Can inputs arrive at different times? What are the restrictions on these inputs? How is the mapping or conversions activated? Do you allow side-effects? (You said no, so ok, but often "side-effect" is replaced with other terms) Is the object interchangeable with the result? (I think yes in your case, but again, some change the terms)
That's my problem with "functional". They leave the definition open so that anything cool that comes out, they can claim it's functional. I call BS on that.
Doesn't that work against functional? Even so, that's the first I've heard of this. In all the papers I've read, I've never encountered this. I've seen the opposite quite often. I remember reading a paper by Backus where he supports pure functional. I know you can add types and all that, but still. You may argue for those differences if you wish.
They can work together just fine. That's straightforward data flow. The language used with this doesn't matter. My issue is that data flow is often called functional in these cases. Also, if you use functional programming anywhere at all, you lose out on a lot of power. That's why I don't use it. I can go into details if you wish.
That's because it is. And I have no problem with that. If the day ever comes that it is publicly announced that this is in fact data flow, then what does that say about functional programming? If you look deeper, you'll start to see the failing of functional programming.
I need to introduce you to a particular reader of mine. But I think that would be cruel and unusual punishment.
BTW, after what you've said, it seems we understand each other's terminology.
There's a new article I just posted. You may want to read that. It has some insights you may be looking for.
By adding nodes, do you mean execution nodes like new machines? The first version won't exactly allow it. But I see no problem with this at all. It'll be in as soon as the prototype is up and running.
The type of messages does alter at runtime, yes. Though I should mention that this only happens when transferring a workload to another node.
Types in Project V would take a book to write about it all. And I do have plans to write one. Like I said, my new article provides more info. You can have runtime types. But all info needed to build an entity is self-contained. Depending on the situation, this information can be stripped away, or it can remain in case it gets transferred to a new machine.
Hmmm... I don't think in this way exactly. Types are there if they're needed and not if not. I could go into detail if you wish. Like if you want to have an executable, then it's all gone. But if you need a dynamic system that can be updated while "live", then there will be a copy of type information floating around somewhere. It's all handled automatically for you.
HAHAHA! You seriously think law shcool would tell their students that they'll ruin lives? Lawyers aren't meant to fix things. They're there to keep the damage going. The law is brought in as a last resort when things have fallen apart. This is all lawyers know and this is what they spread around. The law has never solved anything in the history of humanity. By the time it gets to the law, it's already over. And my experience with them confirms that this is true. You may not think so, and I sincerely hope that when you do have to deal with them, you won't lose too much of your soul. Because you will. I also have some free tickets for any lawyers wishing to go to Pakistan.
Nah. The law is about destroying any chance of a solution. Any law book will tell you the law is of last resort. Programming is about providing solutions. If you need to deal with the law, you've already lost.
By Vorlath, # 7. November 2007, 01:57:21
The topology can change at any time and it uses runtime types depending on the situation. But what do you mean by node? A software component or an execution node like a new computer. Either way, you can change both at runtime.
By Vorlath, # 7. November 2007, 01:59:39
Should I be continuing this topic here, or on a different post, a forum, email?
"BTW, after what you've said, it seems we understand each other's terminology."
Yeah I'd agree for the most part. Though I'd rather talk about more interesting things, you can't have an intelligent conversation without reasonably defined terms, so I'll nail down what I meant by functional earlier. I did have something a LITTLE more specific in mind (I was being very ambiguous).
I'm going to be using Scheme and Haskell as my main contrasting examples (I'm most familiar with these).
"Can you have multiple inputs? (Yes)"
No if the language uses currying (e.g. Haskell, ML), yes if it's Scheme.
"Can you have multiple outputs?"
Not really, but you can always return data structures of course.
"Can inputs arrive at different times?"
Irrelevant to the term as its used. It doesn't really have to do with the particular model of evaluation. They could be evaluated exactly in parallel, from left to right as in Scheme, or on a as-needed-basis, as in Haskell.
"What are the restrictions on these inputs?"
They basically all have type systems, but different languages enforce them at runtime or compile time.
"Do you allow side-effects?"
This is the first important one. A side effect is something that causes a future call to behave differently, like a destructive update to a data structure. In Scheme it's possible but all such functions are indicated with a trailing "!" to alert the programmer that it's not a pure function. So Scheme encourages awareness of this, and lisp doesn't as much. Even though they're very similar languages, a lot of people would call Scheme functional and lisp procedural.
"That's my problem with "functional". They leave the definition open so that anything cool that comes out, they can claim it's functional. I call BS on that."
That's the problem with any paradigm, including "object oriented", "constraint based", "functional", "aspect oriented", and "data flow". None of them are precisely defined, and most well informed programmers never actually use the terms unless they're speaking in very general terms.
Ever since I realized that every object oriented language implements their own flavor of object orientedness (common lisp even implements a whole class of object orientedness, and calls it the meta object protocol), I stopped using the stupid term. Same thing should go for data flow programming. Do you mean functional nets? petri nets maybe? functional reactive programming? maybe even message passing? They're all equally meaningless unless you have a well defined logic to go with them.
So to wrap that all up, When I say functional, I mean "has a concept of higher order functions" (you can pass functions to functions), and there's awareness of side effects (so you can reason about what's happening, and build higher level concepts). Basically, out of existing programming languages, if the language doesn't suck completely, you can call it functional. I'm reasonably sure that most other people in the "functional programming community", if such a thing exists, would have a similar definition on a similar level of ambiguity. You can have completely different underlying model than lambda calculus, like for example components and message passing, and still program in what people would call a "functional style" by passing components through channels, and creating new components based on composing existing ones.
Now for what's actually interesting:
"By adding nodes, do you mean execution nodes like new machines?"
I just meant components. I suppose I should call these components like you do, or processes, and reserve the term "node" for a separate computer on the network.
"Depending on the situation, this information can be stripped away, or it can remain in case it gets transferred to a new machine."
Well, that's pretty cool, and that's exactly what I'd wish for in an environment. But this brings up several questions for me (the kind of which I assume is what's prevented other languages designers from doing this): Say you're done developing, and runtime types are removed. Now your program spawn a new component and starts feeding data to it. How does the new component know its receiving a valid type? Currently I can only imagine three (actually two) options:
1) Your type safety goes out the window as in C; type casts are done on faith
2) All values always have some level of runtime types, to ensure type safety
3) You have some sort of strange incomprehensible mixture of runtime and static types (which intuitively doesn't seem possible). The best I can imagine is a lisp like language where all types are runtime, but when new functions/components/processes are created, as long as they're immutable they can be compiled to efficient assembly and left alone. However, the runtime types are still there for later. This is essentially an optimized option 2, and is irrelevant to the high level semantics.
By anonymous user, # 7. November 2007, 04:12:32
Actually, I might go so far to say (and this might be really stupid, so don't quote me) that anything that implements the concepts of category theory could be called functional. Category theory is extremely general, about one level above set theory. Sadly, it seems to me that many programming languages can't even claim they do this consistently. You can very very easily implement the rules of category theory in any language, but then you're fighting against existing language constructs if it's not "functional".
Many languages stick with morphisms, and don't bother with functors (e.g. PHP and Java) (I hope I have my terminology straight), and many other languages simply throw out morphisms entirely and mainly use procedures (like C and common lisp).
By anonymous user, # 7. November 2007, 04:29:03
OK, I hope I'm not beating a really dead horse at this point. I proposed my analogy to a mathematician + programmer, and the response was:
"Functional programming is just applied category theory."
If you're not already familiar with category theory, here's a really good introduction I found on Reddit a bit ago:
http://math.ucr.edu/home/baez/week73.html
Keep in mind this is just one way of looking at it, but I'll go with this. A category C would correspond to a type. All your functions of type C -> C would be the morphisms in a category C. A higher order function "fh" of type (C -> C) -> (E -> E) for example, would be a functor fh: C -> E, a functor from category/type C to category/type E.
I believe you can represent algebraic data types as categories of categories, but I'm honestly not clear on this concept. Anyway, as long as your morphisms and functors abide by the rules in that link above, you definitely have a functional programming language. That's how general the term is.
By anonymous user, # 7. November 2007, 05:03:15
"Types in Project V would take a book to write about it all."
I would read it too. But before you invest a lot of time in to something like that, I'd really like to see something in the form of a research paper that just states the logic behind the type system, and maybe throws out a few examples.
By anonymous user, # 7. November 2007, 12:57:09
BTW, you can use quote tags a la BBCODE style. [ QUOTE ] bla bla bla [ /QUOTE ] without the spaces inside the tags.
This were just some of the questions that can come up. Not all them. My point being that it's not clearly defined. Neither is the protocol to send and receive data since it's usually handled by the compiler. That's a show stopper for concurrency.
About your quote, structures have indeed been used in the past. But it's extra complexity. When you look at why software isn't composable (or is problematic to do so), look no further than this.
This isn't exactly right. Can you use a function with only one argument when it specifies two and have it do something useful? I don't think that's how it works. So it is directly linked to the model of evaluation.
No, imperative is fairly well defined. So is data flow. I've spoken with the guy that invented it. It's pretty clear what data flow is. I haven't used constraint based too much, but everything I've seen looked clear there too. There is some ambiguity with OO, but again, we can ask Alan Kay what he thinks. And I've linked it many times. He does not call C++ OO.
You first sentence agrees with what I just said above. But this should not apply to everything else. You just pulled a Brooks and used a lawyer tactic. Just because something applies to OO, please do not extend those conclusions to other things such as data flow. Simply go check out JPM's stuff if you want a clear definition. For OO, go check out Alan Kay's stuff.
That's an unsubstantiated blanket statement and you know it. Please do not associate components as defined in data flow and then claim it is (or can be) functional. This is exactly the kind of thing that I find dishonest about the functional community. The differences between the two styles are not trivial.
The new component knows because only valid types can be received if the runtime types have been removed. If something else could arrive, then runtime types (in some form) would remain, even in compiled versions.
Huh? C++ does this. It's not rocket science. If you have all the type info you need, you strip it out. If not, you keep it in and inject some of the compile time code into your binary. That's what C++ does. Pascal/Delphi does the same. I'm sure others do the same.
If you're talking about 100% new components, then there are ways to deal with that too, but again, the compiler will know if your design needs it and will make the appropriate decision on what to do.
I use ZFC. For predicates, I use properties (kind of like members, but changes the meaning of the type) as well as data flow components to spcify the relation between entities. In this way, I can stream data through predicates, something not possible in functional style of programming. After having looked at this intensively with the help of some of my other readers, I can say that the argument that category theory being "functional" doesn't hold much water with me. In fact, there is a name for doing category theory similar to what I'm doing. Unfortunately, I can't remember what it is called right now. When I do remember it, I'll post it so you may inspect it and see that even established literature on the topic would disagree with your assertion.
As a side-note, my use (often limited) of ZFC and data flow predicates is what allows me to infer information about types and if they are needed at runtime. I'm betting some of my readers are shocked that I'm using established (though perhaps less known data flow predicates) to form the basis of my system.
I understood morphisms as already being linked to the data (where this data stay intact). So I don't consider that PHP or Java except maybe for some containers. Perhaps that is what you mean and not the ability to dynamically attach morphisms to data. I'm afraid you've confused me even more by lumping C and lisp together. Or do you mean that they don't have the ability to group many transformations together with the data structure? That would make sense I guess.
Anyways, I can tell you what I did with Project V. There is a certain class of components called storage components. These retain their data. So any outgoing data can be transformed by linking up your own components. The end of this chain can be used as a morphism. Remember how I said that properties can change the meaning of a type. Well, you can use a morphism in place of a static value. Because frankly, a static value is equivalent to a storage component without any intermediary transformations. You can use morphisms in place of members variables too.
Morphism will only be included in the next version, but they have been planned for a while now. The reason it must wait is because it works in a fundamentally different way than the rest of the data flow network. It works on requests for information instead of data moving forward on its own (push vs. pull). Morphisms serve to trigger the completion of that network. Once the circuit is closed, then data will start moving on its own as usual.
No, it's only one specific kind of category theory. Sorry.
Gotta love reddit, eh?
You'll have to forgive me if I instead look elsewhere. For instance, Wikipedia does have a few gems on the Morphism page.
My favorite part is "need not be functions at all". Brilliant! I seem to be the only one that actually LOOKS at these differences and what the consequences are.
No, I already showed how this isn't so. But it does show how functional programmers like to make things more general than they actually are in order to consume anything that looks good and then incorrectly call it functional. In fact, logic programming would have a way better claim to category theory than anything functional.
Can you think critically? Can you determine whether a paper is valid or not without using the fact that it's been published? Most of the stuff out there is bunk. At the same time, I often get the impression people think I pull this stuff out of my ass.
By Vorlath, # 7. November 2007, 17:22:21
Sorry, it's going to take me some more time to respond to the rest of your reply, but for now:
"Can you think critically? Can you determine whether a paper is valid or not without using the fact that it's been published?"
I hope I can think critically. I don't give a shit if a paper is published or not. I don't even know what that means. I find papers via people telling me about them or by browsing/Googling.
BTW, I really think my timeout theory with the security codes is correct.
By anonymous user, # 7. November 2007, 21:40:23
About the comment, I was just asking because you said you wanted to see some references or something. From my POV, that's irrelevant. Look at it and decide if it's good or not.
edit: I should add that if there is existing stuff written on the topic, then yeah, it's worth checking out. But about judging something based on other people's opinions (and that's all most papers are) is not the best way to go about deciding the quality of something.
By Vorlath, # 8. November 2007, 02:13:27
"I was just asking because you said you wanted to see some references"
What? When did I say that?
"But about judging something based on other people's opinions (and that's all most papers are)"
Not if YOU write it!
By anonymous user, # 8. November 2007, 03:37:19
Who else would write a paper on your type system, and the other aspects of ProjectV??
By anonymous user, # 8. November 2007, 09:19:38
I'd be glad to write something like that. That's actually a good idea.
By Vorlath, # 8. November 2007, 18:00:54